1/**
2 * @license
3 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 * Code distributed by Google as part of the polymer project is also
8 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
10// @version 0.5.5
11window.WebComponents = window.WebComponents || {};
12
13(function(scope) {
14  var flags = scope.flags || {};
15  var file = "webcomponents.js";
16  var script = document.querySelector('script[src*="' + file + '"]');
17  if (!flags.noOpts) {
18    location.search.slice(1).split("&").forEach(function(o) {
19      o = o.split("=");
20      o[0] && (flags[o[0]] = o[1] || true);
21    });
22    if (script) {
23      for (var i = 0, a; a = script.attributes[i]; i++) {
24        if (a.name !== "src") {
25          flags[a.name] = a.value || true;
26        }
27      }
28    }
29    if (flags.log) {
30      var parts = flags.log.split(",");
31      flags.log = {};
32      parts.forEach(function(f) {
33        flags.log[f] = true;
34      });
35    } else {
36      flags.log = {};
37    }
38  }
39  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;
40  if (flags.shadow === "native") {
41    flags.shadow = false;
42  } else {
43    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;
44  }
45  if (flags.register) {
46    window.CustomElements = window.CustomElements || {
47      flags: {}
48    };
49    window.CustomElements.flags.register = flags.register;
50  }
51  scope.flags = flags;
52})(WebComponents);
53
54(function(global) {
55  var registrationsTable = new WeakMap();
56  var setImmediate;
57  if (/Trident|Edge/.test(navigator.userAgent)) {
58    setImmediate = setTimeout;
59  } else if (window.setImmediate) {
60    setImmediate = window.setImmediate;
61  } else {
62    var setImmediateQueue = [];
63    var sentinel = String(Math.random());
64    window.addEventListener("message", function(e) {
65      if (e.data === sentinel) {
66        var queue = setImmediateQueue;
67        setImmediateQueue = [];
68        queue.forEach(function(func) {
69          func();
70        });
71      }
72    });
73    setImmediate = function(func) {
74      setImmediateQueue.push(func);
75      window.postMessage(sentinel, "*");
76    };
77  }
78  var isScheduled = false;
79  var scheduledObservers = [];
80  function scheduleCallback(observer) {
81    scheduledObservers.push(observer);
82    if (!isScheduled) {
83      isScheduled = true;
84      setImmediate(dispatchCallbacks);
85    }
86  }
87  function wrapIfNeeded(node) {
88    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
89  }
90  function dispatchCallbacks() {
91    isScheduled = false;
92    var observers = scheduledObservers;
93    scheduledObservers = [];
94    observers.sort(function(o1, o2) {
95      return o1.uid_ - o2.uid_;
96    });
97    var anyNonEmpty = false;
98    observers.forEach(function(observer) {
99      var queue = observer.takeRecords();
100      removeTransientObserversFor(observer);
101      if (queue.length) {
102        observer.callback_(queue, observer);
103        anyNonEmpty = true;
104      }
105    });
106    if (anyNonEmpty) dispatchCallbacks();
107  }
108  function removeTransientObserversFor(observer) {
109    observer.nodes_.forEach(function(node) {
110      var registrations = registrationsTable.get(node);
111      if (!registrations) return;
112      registrations.forEach(function(registration) {
113        if (registration.observer === observer) registration.removeTransientObservers();
114      });
115    });
116  }
117  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
118    for (var node = target; node; node = node.parentNode) {
119      var registrations = registrationsTable.get(node);
120      if (registrations) {
121        for (var j = 0; j < registrations.length; j++) {
122          var registration = registrations[j];
123          var options = registration.options;
124          if (node !== target && !options.subtree) continue;
125          var record = callback(options);
126          if (record) registration.enqueue(record);
127        }
128      }
129    }
130  }
131  var uidCounter = 0;
132  function JsMutationObserver(callback) {
133    this.callback_ = callback;
134    this.nodes_ = [];
135    this.records_ = [];
136    this.uid_ = ++uidCounter;
137  }
138  JsMutationObserver.prototype = {
139    observe: function(target, options) {
140      target = wrapIfNeeded(target);
141      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
142        throw new SyntaxError();
143      }
144      var registrations = registrationsTable.get(target);
145      if (!registrations) registrationsTable.set(target, registrations = []);
146      var registration;
147      for (var i = 0; i < registrations.length; i++) {
148        if (registrations[i].observer === this) {
149          registration = registrations[i];
150          registration.removeListeners();
151          registration.options = options;
152          break;
153        }
154      }
155      if (!registration) {
156        registration = new Registration(this, target, options);
157        registrations.push(registration);
158        this.nodes_.push(target);
159      }
160      registration.addListeners();
161    },
162    disconnect: function() {
163      this.nodes_.forEach(function(node) {
164        var registrations = registrationsTable.get(node);
165        for (var i = 0; i < registrations.length; i++) {
166          var registration = registrations[i];
167          if (registration.observer === this) {
168            registration.removeListeners();
169            registrations.splice(i, 1);
170            break;
171          }
172        }
173      }, this);
174      this.records_ = [];
175    },
176    takeRecords: function() {
177      var copyOfRecords = this.records_;
178      this.records_ = [];
179      return copyOfRecords;
180    }
181  };
182  function MutationRecord(type, target) {
183    this.type = type;
184    this.target = target;
185    this.addedNodes = [];
186    this.removedNodes = [];
187    this.previousSibling = null;
188    this.nextSibling = null;
189    this.attributeName = null;
190    this.attributeNamespace = null;
191    this.oldValue = null;
192  }
193  function copyMutationRecord(original) {
194    var record = new MutationRecord(original.type, original.target);
195    record.addedNodes = original.addedNodes.slice();
196    record.removedNodes = original.removedNodes.slice();
197    record.previousSibling = original.previousSibling;
198    record.nextSibling = original.nextSibling;
199    record.attributeName = original.attributeName;
200    record.attributeNamespace = original.attributeNamespace;
201    record.oldValue = original.oldValue;
202    return record;
203  }
204  var currentRecord, recordWithOldValue;
205  function getRecord(type, target) {
206    return currentRecord = new MutationRecord(type, target);
207  }
208  function getRecordWithOldValue(oldValue) {
209    if (recordWithOldValue) return recordWithOldValue;
210    recordWithOldValue = copyMutationRecord(currentRecord);
211    recordWithOldValue.oldValue = oldValue;
212    return recordWithOldValue;
213  }
214  function clearRecords() {
215    currentRecord = recordWithOldValue = undefined;
216  }
217  function recordRepresentsCurrentMutation(record) {
218    return record === recordWithOldValue || record === currentRecord;
219  }
220  function selectRecord(lastRecord, newRecord) {
221    if (lastRecord === newRecord) return lastRecord;
222    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
223    return null;
224  }
225  function Registration(observer, target, options) {
226    this.observer = observer;
227    this.target = target;
228    this.options = options;
229    this.transientObservedNodes = [];
230  }
231  Registration.prototype = {
232    enqueue: function(record) {
233      var records = this.observer.records_;
234      var length = records.length;
235      if (records.length > 0) {
236        var lastRecord = records[length - 1];
237        var recordToReplaceLast = selectRecord(lastRecord, record);
238        if (recordToReplaceLast) {
239          records[length - 1] = recordToReplaceLast;
240          return;
241        }
242      } else {
243        scheduleCallback(this.observer);
244      }
245      records[length] = record;
246    },
247    addListeners: function() {
248      this.addListeners_(this.target);
249    },
250    addListeners_: function(node) {
251      var options = this.options;
252      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
253      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
254      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
255      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
256    },
257    removeListeners: function() {
258      this.removeListeners_(this.target);
259    },
260    removeListeners_: function(node) {
261      var options = this.options;
262      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
263      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
264      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
265      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
266    },
267    addTransientObserver: function(node) {
268      if (node === this.target) return;
269      this.addListeners_(node);
270      this.transientObservedNodes.push(node);
271      var registrations = registrationsTable.get(node);
272      if (!registrations) registrationsTable.set(node, registrations = []);
273      registrations.push(this);
274    },
275    removeTransientObservers: function() {
276      var transientObservedNodes = this.transientObservedNodes;
277      this.transientObservedNodes = [];
278      transientObservedNodes.forEach(function(node) {
279        this.removeListeners_(node);
280        var registrations = registrationsTable.get(node);
281        for (var i = 0; i < registrations.length; i++) {
282          if (registrations[i] === this) {
283            registrations.splice(i, 1);
284            break;
285          }
286        }
287      }, this);
288    },
289    handleEvent: function(e) {
290      e.stopImmediatePropagation();
291      switch (e.type) {
292       case "DOMAttrModified":
293        var name = e.attrName;
294        var namespace = e.relatedNode.namespaceURI;
295        var target = e.target;
296        var record = new getRecord("attributes", target);
297        record.attributeName = name;
298        record.attributeNamespace = namespace;
299        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
300        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
301          if (!options.attributes) return;
302          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
303            return;
304          }
305          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
306          return record;
307        });
308        break;
309
310       case "DOMCharacterDataModified":
311        var target = e.target;
312        var record = getRecord("characterData", target);
313        var oldValue = e.prevValue;
314        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
315          if (!options.characterData) return;
316          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
317          return record;
318        });
319        break;
320
321       case "DOMNodeRemoved":
322        this.addTransientObserver(e.target);
323
324       case "DOMNodeInserted":
325        var changedNode = e.target;
326        var addedNodes, removedNodes;
327        if (e.type === "DOMNodeInserted") {
328          addedNodes = [ changedNode ];
329          removedNodes = [];
330        } else {
331          addedNodes = [];
332          removedNodes = [ changedNode ];
333        }
334        var previousSibling = changedNode.previousSibling;
335        var nextSibling = changedNode.nextSibling;
336        var record = getRecord("childList", e.target.parentNode);
337        record.addedNodes = addedNodes;
338        record.removedNodes = removedNodes;
339        record.previousSibling = previousSibling;
340        record.nextSibling = nextSibling;
341        forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) {
342          if (!options.childList) return;
343          return record;
344        });
345      }
346      clearRecords();
347    }
348  };
349  global.JsMutationObserver = JsMutationObserver;
350  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;
351})(this);
352
353if (typeof WeakMap === "undefined") {
354  (function() {
355    var defineProperty = Object.defineProperty;
356    var counter = Date.now() % 1e9;
357    var WeakMap = function() {
358      this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
359    };
360    WeakMap.prototype = {
361      set: function(key, value) {
362        var entry = key[this.name];
363        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
364          value: [ key, value ],
365          writable: true
366        });
367        return this;
368      },
369      get: function(key) {
370        var entry;
371        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
372      },
373      "delete": function(key) {
374        var entry = key[this.name];
375        if (!entry || entry[0] !== key) return false;
376        entry[0] = entry[1] = undefined;
377        return true;
378      },
379      has: function(key) {
380        var entry = key[this.name];
381        if (!entry) return false;
382        return entry[0] === key;
383      }
384    };
385    window.WeakMap = WeakMap;
386  })();
387}
388
389window.HTMLImports = window.HTMLImports || {
390  flags: {}
391};
392
393(function(scope) {
394  var IMPORT_LINK_TYPE = "import";
395  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
396  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
397  var wrap = function(node) {
398    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
399  };
400  var rootDocument = wrap(document);
401  var currentScriptDescriptor = {
402    get: function() {
403      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
404      return wrap(script);
405    },
406    configurable: true
407  };
408  Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
409  Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
410  var isIE = /Trident|Edge/.test(navigator.userAgent);
411  function whenReady(callback, doc) {
412    doc = doc || rootDocument;
413    whenDocumentReady(function() {
414      watchImportsLoad(callback, doc);
415    }, doc);
416  }
417  var requiredReadyState = isIE ? "complete" : "interactive";
418  var READY_EVENT = "readystatechange";
419  function isDocumentReady(doc) {
420    return doc.readyState === "complete" || doc.readyState === requiredReadyState;
421  }
422  function whenDocumentReady(callback, doc) {
423    if (!isDocumentReady(doc)) {
424      var checkReady = function() {
425        if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
426          doc.removeEventListener(READY_EVENT, checkReady);
427          whenDocumentReady(callback, doc);
428        }
429      };
430      doc.addEventListener(READY_EVENT, checkReady);
431    } else if (callback) {
432      callback();
433    }
434  }
435  function markTargetLoaded(event) {
436    event.target.__loaded = true;
437  }
438  function watchImportsLoad(callback, doc) {
439    var imports = doc.querySelectorAll("link[rel=import]");
440    var loaded = 0, l = imports.length;
441    function checkDone(d) {
442      if (loaded == l && callback) {
443        callback();
444      }
445    }
446    function loadedImport(e) {
447      markTargetLoaded(e);
448      loaded++;
449      checkDone();
450    }
451    if (l) {
452      for (var i = 0, imp; i < l && (imp = imports[i]); i++) {
453        if (isImportLoaded(imp)) {
454          loadedImport.call(imp, {
455            target: imp
456          });
457        } else {
458          imp.addEventListener("load", loadedImport);
459          imp.addEventListener("error", loadedImport);
460        }
461      }
462    } else {
463      checkDone();
464    }
465  }
466  function isImportLoaded(link) {
467    return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
468  }
469  if (useNative) {
470    new MutationObserver(function(mxns) {
471      for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
472        if (m.addedNodes) {
473          handleImports(m.addedNodes);
474        }
475      }
476    }).observe(document.head, {
477      childList: true
478    });
479    function handleImports(nodes) {
480      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
481        if (isImport(n)) {
482          handleImport(n);
483        }
484      }
485    }
486    function isImport(element) {
487      return element.localName === "link" && element.rel === "import";
488    }
489    function handleImport(element) {
490      var loaded = element.import;
491      if (loaded) {
492        markTargetLoaded({
493          target: element
494        });
495      } else {
496        element.addEventListener("load", markTargetLoaded);
497        element.addEventListener("error", markTargetLoaded);
498      }
499    }
500    (function() {
501      if (document.readyState === "loading") {
502        var imports = document.querySelectorAll("link[rel=import]");
503        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
504          handleImport(imp);
505        }
506      }
507    })();
508  }
509  whenReady(function() {
510    HTMLImports.ready = true;
511    HTMLImports.readyTime = new Date().getTime();
512    var evt = rootDocument.createEvent("CustomEvent");
513    evt.initCustomEvent("HTMLImportsLoaded", true, true, {});
514    rootDocument.dispatchEvent(evt);
515  });
516  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
517  scope.useNative = useNative;
518  scope.rootDocument = rootDocument;
519  scope.whenReady = whenReady;
520  scope.isIE = isIE;
521})(HTMLImports);
522
523(function(scope) {
524  var modules = [];
525  var addModule = function(module) {
526    modules.push(module);
527  };
528  var initializeModules = function() {
529    modules.forEach(function(module) {
530      module(scope);
531    });
532  };
533  scope.addModule = addModule;
534  scope.initializeModules = initializeModules;
535})(HTMLImports);
536
537HTMLImports.addModule(function(scope) {
538  var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
539  var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
540  var path = {
541    resolveUrlsInStyle: function(style) {
542      var doc = style.ownerDocument;
543      var resolver = doc.createElement("a");
544      style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
545      return style;
546    },
547    resolveUrlsInCssText: function(cssText, urlObj) {
548      var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
549      r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
550      return r;
551    },
552    replaceUrls: function(text, urlObj, regexp) {
553      return text.replace(regexp, function(m, pre, url, post) {
554        var urlPath = url.replace(/["']/g, "");
555        urlObj.href = urlPath;
556        urlPath = urlObj.href;
557        return pre + "'" + urlPath + "'" + post;
558      });
559    }
560  };
561  scope.path = path;
562});
563
564HTMLImports.addModule(function(scope) {
565  var xhr = {
566    async: true,
567    ok: function(request) {
568      return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
569    },
570    load: function(url, next, nextContext) {
571      var request = new XMLHttpRequest();
572      if (scope.flags.debug || scope.flags.bust) {
573        url += "?" + Math.random();
574      }
575      request.open("GET", url, xhr.async);
576      request.addEventListener("readystatechange", function(e) {
577        if (request.readyState === 4) {
578          var locationHeader = request.getResponseHeader("Location");
579          var redirectedUrl = null;
580          if (locationHeader) {
581            var redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
582          }
583          next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
584        }
585      });
586      request.send();
587      return request;
588    },
589    loadDocument: function(url, next, nextContext) {
590      this.load(url, next, nextContext).responseType = "document";
591    }
592  };
593  scope.xhr = xhr;
594});
595
596HTMLImports.addModule(function(scope) {
597  var xhr = scope.xhr;
598  var flags = scope.flags;
599  var Loader = function(onLoad, onComplete) {
600    this.cache = {};
601    this.onload = onLoad;
602    this.oncomplete = onComplete;
603    this.inflight = 0;
604    this.pending = {};
605  };
606  Loader.prototype = {
607    addNodes: function(nodes) {
608      this.inflight += nodes.length;
609      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
610        this.require(n);
611      }
612      this.checkDone();
613    },
614    addNode: function(node) {
615      this.inflight++;
616      this.require(node);
617      this.checkDone();
618    },
619    require: function(elt) {
620      var url = elt.src || elt.href;
621      elt.__nodeUrl = url;
622      if (!this.dedupe(url, elt)) {
623        this.fetch(url, elt);
624      }
625    },
626    dedupe: function(url, elt) {
627      if (this.pending[url]) {
628        this.pending[url].push(elt);
629        return true;
630      }
631      var resource;
632      if (this.cache[url]) {
633        this.onload(url, elt, this.cache[url]);
634        this.tail();
635        return true;
636      }
637      this.pending[url] = [ elt ];
638      return false;
639    },
640    fetch: function(url, elt) {
641      flags.load && console.log("fetch", url, elt);
642      if (!url) {
643        setTimeout(function() {
644          this.receive(url, elt, {
645            error: "href must be specified"
646          }, null);
647        }.bind(this), 0);
648      } else if (url.match(/^data:/)) {
649        var pieces = url.split(",");
650        var header = pieces[0];
651        var body = pieces[1];
652        if (header.indexOf(";base64") > -1) {
653          body = atob(body);
654        } else {
655          body = decodeURIComponent(body);
656        }
657        setTimeout(function() {
658          this.receive(url, elt, null, body);
659        }.bind(this), 0);
660      } else {
661        var receiveXhr = function(err, resource, redirectedUrl) {
662          this.receive(url, elt, err, resource, redirectedUrl);
663        }.bind(this);
664        xhr.load(url, receiveXhr);
665      }
666    },
667    receive: function(url, elt, err, resource, redirectedUrl) {
668      this.cache[url] = resource;
669      var $p = this.pending[url];
670      for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
671        this.onload(url, p, resource, err, redirectedUrl);
672        this.tail();
673      }
674      this.pending[url] = null;
675    },
676    tail: function() {
677      --this.inflight;
678      this.checkDone();
679    },
680    checkDone: function() {
681      if (!this.inflight) {
682        this.oncomplete();
683      }
684    }
685  };
686  scope.Loader = Loader;
687});
688
689HTMLImports.addModule(function(scope) {
690  var Observer = function(addCallback) {
691    this.addCallback = addCallback;
692    this.mo = new MutationObserver(this.handler.bind(this));
693  };
694  Observer.prototype = {
695    handler: function(mutations) {
696      for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
697        if (m.type === "childList" && m.addedNodes.length) {
698          this.addedNodes(m.addedNodes);
699        }
700      }
701    },
702    addedNodes: function(nodes) {
703      if (this.addCallback) {
704        this.addCallback(nodes);
705      }
706      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
707        if (n.children && n.children.length) {
708          this.addedNodes(n.children);
709        }
710      }
711    },
712    observe: function(root) {
713      this.mo.observe(root, {
714        childList: true,
715        subtree: true
716      });
717    }
718  };
719  scope.Observer = Observer;
720});
721
722HTMLImports.addModule(function(scope) {
723  var path = scope.path;
724  var rootDocument = scope.rootDocument;
725  var flags = scope.flags;
726  var isIE = scope.isIE;
727  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
728  var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
729  var importParser = {
730    documentSelectors: IMPORT_SELECTOR,
731    importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]", "style", "script:not([type])", 'script[type="text/javascript"]' ].join(","),
732    map: {
733      link: "parseLink",
734      script: "parseScript",
735      style: "parseStyle"
736    },
737    dynamicElements: [],
738    parseNext: function() {
739      var next = this.nextToParse();
740      if (next) {
741        this.parse(next);
742      }
743    },
744    parse: function(elt) {
745      if (this.isParsed(elt)) {
746        flags.parse && console.log("[%s] is already parsed", elt.localName);
747        return;
748      }
749      var fn = this[this.map[elt.localName]];
750      if (fn) {
751        this.markParsing(elt);
752        fn.call(this, elt);
753      }
754    },
755    parseDynamic: function(elt, quiet) {
756      this.dynamicElements.push(elt);
757      if (!quiet) {
758        this.parseNext();
759      }
760    },
761    markParsing: function(elt) {
762      flags.parse && console.log("parsing", elt);
763      this.parsingElement = elt;
764    },
765    markParsingComplete: function(elt) {
766      elt.__importParsed = true;
767      this.markDynamicParsingComplete(elt);
768      if (elt.__importElement) {
769        elt.__importElement.__importParsed = true;
770        this.markDynamicParsingComplete(elt.__importElement);
771      }
772      this.parsingElement = null;
773      flags.parse && console.log("completed", elt);
774    },
775    markDynamicParsingComplete: function(elt) {
776      var i = this.dynamicElements.indexOf(elt);
777      if (i >= 0) {
778        this.dynamicElements.splice(i, 1);
779      }
780    },
781    parseImport: function(elt) {
782      if (HTMLImports.__importsParsingHook) {
783        HTMLImports.__importsParsingHook(elt);
784      }
785      if (elt.import) {
786        elt.import.__importParsed = true;
787      }
788      this.markParsingComplete(elt);
789      if (elt.__resource && !elt.__error) {
790        elt.dispatchEvent(new CustomEvent("load", {
791          bubbles: false
792        }));
793      } else {
794        elt.dispatchEvent(new CustomEvent("error", {
795          bubbles: false
796        }));
797      }
798      if (elt.__pending) {
799        var fn;
800        while (elt.__pending.length) {
801          fn = elt.__pending.shift();
802          if (fn) {
803            fn({
804              target: elt
805            });
806          }
807        }
808      }
809      this.parseNext();
810    },
811    parseLink: function(linkElt) {
812      if (nodeIsImport(linkElt)) {
813        this.parseImport(linkElt);
814      } else {
815        linkElt.href = linkElt.href;
816        this.parseGeneric(linkElt);
817      }
818    },
819    parseStyle: function(elt) {
820      var src = elt;
821      elt = cloneStyle(elt);
822      elt.__importElement = src;
823      this.parseGeneric(elt);
824    },
825    parseGeneric: function(elt) {
826      this.trackElement(elt);
827      this.addElementToDocument(elt);
828    },
829    rootImportForElement: function(elt) {
830      var n = elt;
831      while (n.ownerDocument.__importLink) {
832        n = n.ownerDocument.__importLink;
833      }
834      return n;
835    },
836    addElementToDocument: function(elt) {
837      var port = this.rootImportForElement(elt.__importElement || elt);
838      port.parentNode.insertBefore(elt, port);
839    },
840    trackElement: function(elt, callback) {
841      var self = this;
842      var done = function(e) {
843        if (callback) {
844          callback(e);
845        }
846        self.markParsingComplete(elt);
847        self.parseNext();
848      };
849      elt.addEventListener("load", done);
850      elt.addEventListener("error", done);
851      if (isIE && elt.localName === "style") {
852        var fakeLoad = false;
853        if (elt.textContent.indexOf("@import") == -1) {
854          fakeLoad = true;
855        } else if (elt.sheet) {
856          fakeLoad = true;
857          var csr = elt.sheet.cssRules;
858          var len = csr ? csr.length : 0;
859          for (var i = 0, r; i < len && (r = csr[i]); i++) {
860            if (r.type === CSSRule.IMPORT_RULE) {
861              fakeLoad = fakeLoad && Boolean(r.styleSheet);
862            }
863          }
864        }
865        if (fakeLoad) {
866          elt.dispatchEvent(new CustomEvent("load", {
867            bubbles: false
868          }));
869        }
870      }
871    },
872    parseScript: function(scriptElt) {
873      var script = document.createElement("script");
874      script.__importElement = scriptElt;
875      script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
876      scope.currentScript = scriptElt;
877      this.trackElement(script, function(e) {
878        script.parentNode.removeChild(script);
879        scope.currentScript = null;
880      });
881      this.addElementToDocument(script);
882    },
883    nextToParse: function() {
884      this._mayParse = [];
885      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
886    },
887    nextToParseInDoc: function(doc, link) {
888      if (doc && this._mayParse.indexOf(doc) < 0) {
889        this._mayParse.push(doc);
890        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
891        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {
892          if (!this.isParsed(n)) {
893            if (this.hasResource(n)) {
894              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
895            } else {
896              return;
897            }
898          }
899        }
900      }
901      return link;
902    },
903    nextToParseDynamic: function() {
904      return this.dynamicElements[0];
905    },
906    parseSelectorsForNode: function(node) {
907      var doc = node.ownerDocument || node;
908      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
909    },
910    isParsed: function(node) {
911      return node.__importParsed;
912    },
913    needsDynamicParsing: function(elt) {
914      return this.dynamicElements.indexOf(elt) >= 0;
915    },
916    hasResource: function(node) {
917      if (nodeIsImport(node) && node.import === undefined) {
918        return false;
919      }
920      return true;
921    }
922  };
923  function nodeIsImport(elt) {
924    return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
925  }
926  function generateScriptDataUrl(script) {
927    var scriptContent = generateScriptContent(script);
928    return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
929  }
930  function generateScriptContent(script) {
931    return script.textContent + generateSourceMapHint(script);
932  }
933  function generateSourceMapHint(script) {
934    var owner = script.ownerDocument;
935    owner.__importedScripts = owner.__importedScripts || 0;
936    var moniker = script.ownerDocument.baseURI;
937    var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
938    owner.__importedScripts++;
939    return "\n//# sourceURL=" + moniker + num + ".js\n";
940  }
941  function cloneStyle(style) {
942    var clone = style.ownerDocument.createElement("style");
943    clone.textContent = style.textContent;
944    path.resolveUrlsInStyle(clone);
945    return clone;
946  }
947  scope.parser = importParser;
948  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
949});
950
951HTMLImports.addModule(function(scope) {
952  var flags = scope.flags;
953  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
954  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
955  var rootDocument = scope.rootDocument;
956  var Loader = scope.Loader;
957  var Observer = scope.Observer;
958  var parser = scope.parser;
959  var importer = {
960    documents: {},
961    documentPreloadSelectors: IMPORT_SELECTOR,
962    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
963    loadNode: function(node) {
964      importLoader.addNode(node);
965    },
966    loadSubtree: function(parent) {
967      var nodes = this.marshalNodes(parent);
968      importLoader.addNodes(nodes);
969    },
970    marshalNodes: function(parent) {
971      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
972    },
973    loadSelectorsForNode: function(node) {
974      var doc = node.ownerDocument || node;
975      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
976    },
977    loaded: function(url, elt, resource, err, redirectedUrl) {
978      flags.load && console.log("loaded", url, elt);
979      elt.__resource = resource;
980      elt.__error = err;
981      if (isImportLink(elt)) {
982        var doc = this.documents[url];
983        if (doc === undefined) {
984          doc = err ? null : makeDocument(resource, redirectedUrl || url);
985          if (doc) {
986            doc.__importLink = elt;
987            this.bootDocument(doc);
988          }
989          this.documents[url] = doc;
990        }
991        elt.import = doc;
992      }
993      parser.parseNext();
994    },
995    bootDocument: function(doc) {
996      this.loadSubtree(doc);
997      this.observer.observe(doc);
998      parser.parseNext();
999    },
1000    loadedAll: function() {
1001      parser.parseNext();
1002    }
1003  };
1004  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
1005  importer.observer = new Observer();
1006  function isImportLink(elt) {
1007    return isLinkRel(elt, IMPORT_LINK_TYPE);
1008  }
1009  function isLinkRel(elt, rel) {
1010    return elt.localName === "link" && elt.getAttribute("rel") === rel;
1011  }
1012  function hasBaseURIAccessor(doc) {
1013    return !!Object.getOwnPropertyDescriptor(doc, "baseURI");
1014  }
1015  function makeDocument(resource, url) {
1016    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
1017    doc._URL = url;
1018    var base = doc.createElement("base");
1019    base.setAttribute("href", url);
1020    if (!doc.baseURI && !hasBaseURIAccessor(doc)) {
1021      Object.defineProperty(doc, "baseURI", {
1022        value: url
1023      });
1024    }
1025    var meta = doc.createElement("meta");
1026    meta.setAttribute("charset", "utf-8");
1027    doc.head.appendChild(meta);
1028    doc.head.appendChild(base);
1029    doc.body.innerHTML = resource;
1030    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
1031      HTMLTemplateElement.bootstrap(doc);
1032    }
1033    return doc;
1034  }
1035  if (!document.baseURI) {
1036    var baseURIDescriptor = {
1037      get: function() {
1038        var base = document.querySelector("base");
1039        return base ? base.href : window.location.href;
1040      },
1041      configurable: true
1042    };
1043    Object.defineProperty(document, "baseURI", baseURIDescriptor);
1044    Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
1045  }
1046  scope.importer = importer;
1047  scope.importLoader = importLoader;
1048});
1049
1050HTMLImports.addModule(function(scope) {
1051  var parser = scope.parser;
1052  var importer = scope.importer;
1053  var dynamic = {
1054    added: function(nodes) {
1055      var owner, parsed, loading;
1056      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
1057        if (!owner) {
1058          owner = n.ownerDocument;
1059          parsed = parser.isParsed(owner);
1060        }
1061        loading = this.shouldLoadNode(n);
1062        if (loading) {
1063          importer.loadNode(n);
1064        }
1065        if (this.shouldParseNode(n) && parsed) {
1066          parser.parseDynamic(n, loading);
1067        }
1068      }
1069    },
1070    shouldLoadNode: function(node) {
1071      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
1072    },
1073    shouldParseNode: function(node) {
1074      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
1075    }
1076  };
1077  importer.observer.addCallback = dynamic.added.bind(dynamic);
1078  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
1079});
1080
1081(function(scope) {
1082  var initializeModules = scope.initializeModules;
1083  var isIE = scope.isIE;
1084  if (scope.useNative) {
1085    return;
1086  }
1087  if (isIE && typeof window.CustomEvent !== "function") {
1088    window.CustomEvent = function(inType, params) {
1089      params = params || {};
1090      var e = document.createEvent("CustomEvent");
1091      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
1092      return e;
1093    };
1094    window.CustomEvent.prototype = window.Event.prototype;
1095  }
1096  initializeModules();
1097  var rootDocument = scope.rootDocument;
1098  function bootstrap() {
1099    HTMLImports.importer.bootDocument(rootDocument);
1100  }
1101  if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
1102    bootstrap();
1103  } else {
1104    document.addEventListener("DOMContentLoaded", bootstrap);
1105  }
1106})(HTMLImports);
1107
1108window.CustomElements = window.CustomElements || {
1109  flags: {}
1110};
1111
1112(function(scope) {
1113  var flags = scope.flags;
1114  var modules = [];
1115  var addModule = function(module) {
1116    modules.push(module);
1117  };
1118  var initializeModules = function() {
1119    modules.forEach(function(module) {
1120      module(scope);
1121    });
1122  };
1123  scope.addModule = addModule;
1124  scope.initializeModules = initializeModules;
1125  scope.hasNative = Boolean(document.registerElement);
1126  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);
1127})(CustomElements);
1128
1129CustomElements.addModule(function(scope) {
1130  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : "none";
1131  function forSubtree(node, cb) {
1132    findAllElements(node, function(e) {
1133      if (cb(e)) {
1134        return true;
1135      }
1136      forRoots(e, cb);
1137    });
1138    forRoots(node, cb);
1139  }
1140  function findAllElements(node, find, data) {
1141    var e = node.firstElementChild;
1142    if (!e) {
1143      e = node.firstChild;
1144      while (e && e.nodeType !== Node.ELEMENT_NODE) {
1145        e = e.nextSibling;
1146      }
1147    }
1148    while (e) {
1149      if (find(e, data) !== true) {
1150        findAllElements(e, find, data);
1151      }
1152      e = e.nextElementSibling;
1153    }
1154    return null;
1155  }
1156  function forRoots(node, cb) {
1157    var root = node.shadowRoot;
1158    while (root) {
1159      forSubtree(root, cb);
1160      root = root.olderShadowRoot;
1161    }
1162  }
1163  var processingDocuments;
1164  function forDocumentTree(doc, cb) {
1165    processingDocuments = [];
1166    _forDocumentTree(doc, cb);
1167    processingDocuments = null;
1168  }
1169  function _forDocumentTree(doc, cb) {
1170    doc = wrap(doc);
1171    if (processingDocuments.indexOf(doc) >= 0) {
1172      return;
1173    }
1174    processingDocuments.push(doc);
1175    var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]");
1176    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {
1177      if (n.import) {
1178        _forDocumentTree(n.import, cb);
1179      }
1180    }
1181    cb(doc);
1182  }
1183  scope.forDocumentTree = forDocumentTree;
1184  scope.forSubtree = forSubtree;
1185});
1186
1187CustomElements.addModule(function(scope) {
1188  var flags = scope.flags;
1189  var forSubtree = scope.forSubtree;
1190  var forDocumentTree = scope.forDocumentTree;
1191  function addedNode(node) {
1192    return added(node) || addedSubtree(node);
1193  }
1194  function added(node) {
1195    if (scope.upgrade(node)) {
1196      return true;
1197    }
1198    attached(node);
1199  }
1200  function addedSubtree(node) {
1201    forSubtree(node, function(e) {
1202      if (added(e)) {
1203        return true;
1204      }
1205    });
1206  }
1207  function attachedNode(node) {
1208    attached(node);
1209    if (inDocument(node)) {
1210      forSubtree(node, function(e) {
1211        attached(e);
1212      });
1213    }
1214  }
1215  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;
1216  scope.hasPolyfillMutations = hasPolyfillMutations;
1217  var isPendingMutations = false;
1218  var pendingMutations = [];
1219  function deferMutation(fn) {
1220    pendingMutations.push(fn);
1221    if (!isPendingMutations) {
1222      isPendingMutations = true;
1223      setTimeout(takeMutations);
1224    }
1225  }
1226  function takeMutations() {
1227    isPendingMutations = false;
1228    var $p = pendingMutations;
1229    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
1230      p();
1231    }
1232    pendingMutations = [];
1233  }
1234  function attached(element) {
1235    if (hasPolyfillMutations) {
1236      deferMutation(function() {
1237        _attached(element);
1238      });
1239    } else {
1240      _attached(element);
1241    }
1242  }
1243  function _attached(element) {
1244    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
1245      if (!element.__attached && inDocument(element)) {
1246        element.__attached = true;
1247        if (element.attachedCallback) {
1248          element.attachedCallback();
1249        }
1250      }
1251    }
1252  }
1253  function detachedNode(node) {
1254    detached(node);
1255    forSubtree(node, function(e) {
1256      detached(e);
1257    });
1258  }
1259  function detached(element) {
1260    if (hasPolyfillMutations) {
1261      deferMutation(function() {
1262        _detached(element);
1263      });
1264    } else {
1265      _detached(element);
1266    }
1267  }
1268  function _detached(element) {
1269    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
1270      if (element.__attached && !inDocument(element)) {
1271        element.__attached = false;
1272        if (element.detachedCallback) {
1273          element.detachedCallback();
1274        }
1275      }
1276    }
1277  }
1278  function inDocument(element) {
1279    var p = element;
1280    var doc = wrap(document);
1281    while (p) {
1282      if (p == doc) {
1283        return true;
1284      }
1285      p = p.parentNode || p.host;
1286    }
1287  }
1288  function watchShadow(node) {
1289    if (node.shadowRoot && !node.shadowRoot.__watched) {
1290      flags.dom && console.log("watching shadow-root for: ", node.localName);
1291      var root = node.shadowRoot;
1292      while (root) {
1293        observe(root);
1294        root = root.olderShadowRoot;
1295      }
1296    }
1297  }
1298  function handler(mutations) {
1299    if (flags.dom) {
1300      var mx = mutations[0];
1301      if (mx && mx.type === "childList" && mx.addedNodes) {
1302        if (mx.addedNodes) {
1303          var d = mx.addedNodes[0];
1304          while (d && d !== document && !d.host) {
1305            d = d.parentNode;
1306          }
1307          var u = d && (d.URL || d._URL || d.host && d.host.localName) || "";
1308          u = u.split("/?").shift().split("/").pop();
1309        }
1310      }
1311      console.group("mutations (%d) [%s]", mutations.length, u || "");
1312    }
1313    mutations.forEach(function(mx) {
1314      if (mx.type === "childList") {
1315        forEach(mx.addedNodes, function(n) {
1316          if (!n.localName) {
1317            return;
1318          }
1319          addedNode(n);
1320        });
1321        forEach(mx.removedNodes, function(n) {
1322          if (!n.localName) {
1323            return;
1324          }
1325          detachedNode(n);
1326        });
1327      }
1328    });
1329    flags.dom && console.groupEnd();
1330  }
1331  function takeRecords(node) {
1332    node = wrap(node);
1333    if (!node) {
1334      node = wrap(document);
1335    }
1336    while (node.parentNode) {
1337      node = node.parentNode;
1338    }
1339    var observer = node.__observer;
1340    if (observer) {
1341      handler(observer.takeRecords());
1342      takeMutations();
1343    }
1344  }
1345  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
1346  function observe(inRoot) {
1347    if (inRoot.__observer) {
1348      return;
1349    }
1350    var observer = new MutationObserver(handler);
1351    observer.observe(inRoot, {
1352      childList: true,
1353      subtree: true
1354    });
1355    inRoot.__observer = observer;
1356  }
1357  function upgradeDocument(doc) {
1358    doc = wrap(doc);
1359    flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop());
1360    addedNode(doc);
1361    observe(doc);
1362    flags.dom && console.groupEnd();
1363  }
1364  function upgradeDocumentTree(doc) {
1365    forDocumentTree(doc, upgradeDocument);
1366  }
1367  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
1368  if (originalCreateShadowRoot) {
1369    Element.prototype.createShadowRoot = function() {
1370      var root = originalCreateShadowRoot.call(this);
1371      CustomElements.watchShadow(this);
1372      return root;
1373    };
1374  }
1375  scope.watchShadow = watchShadow;
1376  scope.upgradeDocumentTree = upgradeDocumentTree;
1377  scope.upgradeSubtree = addedSubtree;
1378  scope.upgradeAll = addedNode;
1379  scope.attachedNode = attachedNode;
1380  scope.takeRecords = takeRecords;
1381});
1382
1383CustomElements.addModule(function(scope) {
1384  var flags = scope.flags;
1385  function upgrade(node) {
1386    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
1387      var is = node.getAttribute("is");
1388      var definition = scope.getRegisteredDefinition(is || node.localName);
1389      if (definition) {
1390        if (is && definition.tag == node.localName) {
1391          return upgradeWithDefinition(node, definition);
1392        } else if (!is && !definition.extends) {
1393          return upgradeWithDefinition(node, definition);
1394        }
1395      }
1396    }
1397  }
1398  function upgradeWithDefinition(element, definition) {
1399    flags.upgrade && console.group("upgrade:", element.localName);
1400    if (definition.is) {
1401      element.setAttribute("is", definition.is);
1402    }
1403    implementPrototype(element, definition);
1404    element.__upgraded__ = true;
1405    created(element);
1406    scope.attachedNode(element);
1407    scope.upgradeSubtree(element);
1408    flags.upgrade && console.groupEnd();
1409    return element;
1410  }
1411  function implementPrototype(element, definition) {
1412    if (Object.__proto__) {
1413      element.__proto__ = definition.prototype;
1414    } else {
1415      customMixin(element, definition.prototype, definition.native);
1416      element.__proto__ = definition.prototype;
1417    }
1418  }
1419  function customMixin(inTarget, inSrc, inNative) {
1420    var used = {};
1421    var p = inSrc;
1422    while (p !== inNative && p !== HTMLElement.prototype) {
1423      var keys = Object.getOwnPropertyNames(p);
1424      for (var i = 0, k; k = keys[i]; i++) {
1425        if (!used[k]) {
1426          Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k));
1427          used[k] = 1;
1428        }
1429      }
1430      p = Object.getPrototypeOf(p);
1431    }
1432  }
1433  function created(element) {
1434    if (element.createdCallback) {
1435      element.createdCallback();
1436    }
1437  }
1438  scope.upgrade = upgrade;
1439  scope.upgradeWithDefinition = upgradeWithDefinition;
1440  scope.implementPrototype = implementPrototype;
1441});
1442
1443CustomElements.addModule(function(scope) {
1444  var upgradeDocumentTree = scope.upgradeDocumentTree;
1445  var upgrade = scope.upgrade;
1446  var upgradeWithDefinition = scope.upgradeWithDefinition;
1447  var implementPrototype = scope.implementPrototype;
1448  var useNative = scope.useNative;
1449  function register(name, options) {
1450    var definition = options || {};
1451    if (!name) {
1452      throw new Error("document.registerElement: first argument `name` must not be empty");
1453    }
1454    if (name.indexOf("-") < 0) {
1455      throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'.");
1456    }
1457    if (isReservedTag(name)) {
1458      throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid.");
1459    }
1460    if (getRegisteredDefinition(name)) {
1461      throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered");
1462    }
1463    if (!definition.prototype) {
1464      definition.prototype = Object.create(HTMLElement.prototype);
1465    }
1466    definition.__name = name.toLowerCase();
1467    definition.lifecycle = definition.lifecycle || {};
1468    definition.ancestry = ancestry(definition.extends);
1469    resolveTagName(definition);
1470    resolvePrototypeChain(definition);
1471    overrideAttributeApi(definition.prototype);
1472    registerDefinition(definition.__name, definition);
1473    definition.ctor = generateConstructor(definition);
1474    definition.ctor.prototype = definition.prototype;
1475    definition.prototype.constructor = definition.ctor;
1476    if (scope.ready) {
1477      upgradeDocumentTree(document);
1478    }
1479    return definition.ctor;
1480  }
1481  function overrideAttributeApi(prototype) {
1482    if (prototype.setAttribute._polyfilled) {
1483      return;
1484    }
1485    var setAttribute = prototype.setAttribute;
1486    prototype.setAttribute = function(name, value) {
1487      changeAttribute.call(this, name, value, setAttribute);
1488    };
1489    var removeAttribute = prototype.removeAttribute;
1490    prototype.removeAttribute = function(name) {
1491      changeAttribute.call(this, name, null, removeAttribute);
1492    };
1493    prototype.setAttribute._polyfilled = true;
1494  }
1495  function changeAttribute(name, value, operation) {
1496    name = name.toLowerCase();
1497    var oldValue = this.getAttribute(name);
1498    operation.apply(this, arguments);
1499    var newValue = this.getAttribute(name);
1500    if (this.attributeChangedCallback && newValue !== oldValue) {
1501      this.attributeChangedCallback(name, oldValue, newValue);
1502    }
1503  }
1504  function isReservedTag(name) {
1505    for (var i = 0; i < reservedTagList.length; i++) {
1506      if (name === reservedTagList[i]) {
1507        return true;
1508      }
1509    }
1510  }
1511  var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ];
1512  function ancestry(extnds) {
1513    var extendee = getRegisteredDefinition(extnds);
1514    if (extendee) {
1515      return ancestry(extendee.extends).concat([ extendee ]);
1516    }
1517    return [];
1518  }
1519  function resolveTagName(definition) {
1520    var baseTag = definition.extends;
1521    for (var i = 0, a; a = definition.ancestry[i]; i++) {
1522      baseTag = a.is && a.tag;
1523    }
1524    definition.tag = baseTag || definition.__name;
1525    if (baseTag) {
1526      definition.is = definition.__name;
1527    }
1528  }
1529  function resolvePrototypeChain(definition) {
1530    if (!Object.__proto__) {
1531      var nativePrototype = HTMLElement.prototype;
1532      if (definition.is) {
1533        var inst = document.createElement(definition.tag);
1534        var expectedPrototype = Object.getPrototypeOf(inst);
1535        if (expectedPrototype === definition.prototype) {
1536          nativePrototype = expectedPrototype;
1537        }
1538      }
1539      var proto = definition.prototype, ancestor;
1540      while (proto && proto !== nativePrototype) {
1541        ancestor = Object.getPrototypeOf(proto);
1542        proto.__proto__ = ancestor;
1543        proto = ancestor;
1544      }
1545      definition.native = nativePrototype;
1546    }
1547  }
1548  function instantiate(definition) {
1549    return upgradeWithDefinition(domCreateElement(definition.tag), definition);
1550  }
1551  var registry = {};
1552  function getRegisteredDefinition(name) {
1553    if (name) {
1554      return registry[name.toLowerCase()];
1555    }
1556  }
1557  function registerDefinition(name, definition) {
1558    registry[name] = definition;
1559  }
1560  function generateConstructor(definition) {
1561    return function() {
1562      return instantiate(definition);
1563    };
1564  }
1565  var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
1566  function createElementNS(namespace, tag, typeExtension) {
1567    if (namespace === HTML_NAMESPACE) {
1568      return createElement(tag, typeExtension);
1569    } else {
1570      return domCreateElementNS(namespace, tag);
1571    }
1572  }
1573  function createElement(tag, typeExtension) {
1574    var definition = getRegisteredDefinition(typeExtension || tag);
1575    if (definition) {
1576      if (tag == definition.tag && typeExtension == definition.is) {
1577        return new definition.ctor();
1578      }
1579      if (!typeExtension && !definition.is) {
1580        return new definition.ctor();
1581      }
1582    }
1583    var element;
1584    if (typeExtension) {
1585      element = createElement(tag);
1586      element.setAttribute("is", typeExtension);
1587      return element;
1588    }
1589    element = domCreateElement(tag);
1590    if (tag.indexOf("-") >= 0) {
1591      implementPrototype(element, HTMLElement);
1592    }
1593    return element;
1594  }
1595  function cloneNode(deep) {
1596    var n = domCloneNode.call(this, deep);
1597    upgrade(n);
1598    return n;
1599  }
1600  var domCreateElement = document.createElement.bind(document);
1601  var domCreateElementNS = document.createElementNS.bind(document);
1602  var domCloneNode = Node.prototype.cloneNode;
1603  var isInstance;
1604  if (!Object.__proto__ && !useNative) {
1605    isInstance = function(obj, ctor) {
1606      var p = obj;
1607      while (p) {
1608        if (p === ctor.prototype) {
1609          return true;
1610        }
1611        p = p.__proto__;
1612      }
1613      return false;
1614    };
1615  } else {
1616    isInstance = function(obj, base) {
1617      return obj instanceof base;
1618    };
1619  }
1620  document.registerElement = register;
1621  document.createElement = createElement;
1622  document.createElementNS = createElementNS;
1623  Node.prototype.cloneNode = cloneNode;
1624  scope.registry = registry;
1625  scope.instanceof = isInstance;
1626  scope.reservedTagList = reservedTagList;
1627  scope.getRegisteredDefinition = getRegisteredDefinition;
1628  document.register = document.registerElement;
1629});
1630
1631(function(scope) {
1632  var useNative = scope.useNative;
1633  var initializeModules = scope.initializeModules;
1634  var isIE11OrOlder = /Trident/.test(navigator.userAgent);
1635  if (useNative) {
1636    var nop = function() {};
1637    scope.watchShadow = nop;
1638    scope.upgrade = nop;
1639    scope.upgradeAll = nop;
1640    scope.upgradeDocumentTree = nop;
1641    scope.upgradeSubtree = nop;
1642    scope.takeRecords = nop;
1643    scope.instanceof = function(obj, base) {
1644      return obj instanceof base;
1645    };
1646  } else {
1647    initializeModules();
1648  }
1649  var upgradeDocumentTree = scope.upgradeDocumentTree;
1650  if (!window.wrap) {
1651    if (window.ShadowDOMPolyfill) {
1652      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
1653      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
1654    } else {
1655      window.wrap = window.unwrap = function(node) {
1656        return node;
1657      };
1658    }
1659  }
1660  function bootstrap() {
1661    upgradeDocumentTree(wrap(document));
1662    if (window.HTMLImports) {
1663      HTMLImports.__importsParsingHook = function(elt) {
1664        upgradeDocumentTree(wrap(elt.import));
1665      };
1666    }
1667    CustomElements.ready = true;
1668    setTimeout(function() {
1669      CustomElements.readyTime = Date.now();
1670      if (window.HTMLImports) {
1671        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
1672      }
1673      document.dispatchEvent(new CustomEvent("WebComponentsReady", {
1674        bubbles: true
1675      }));
1676    });
1677  }
1678  if (isIE11OrOlder && typeof window.CustomEvent !== "function") {
1679    window.CustomEvent = function(inType, params) {
1680      params = params || {};
1681      var e = document.createEvent("CustomEvent");
1682      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
1683      return e;
1684    };
1685    window.CustomEvent.prototype = window.Event.prototype;
1686  }
1687  if (document.readyState === "complete" || scope.flags.eager) {
1688    bootstrap();
1689  } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {
1690    bootstrap();
1691  } else {
1692    var loadEvent = window.HTMLImports && !HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded";
1693    window.addEventListener(loadEvent, bootstrap);
1694  }
1695})(window.CustomElements);
1696
1697if (typeof HTMLTemplateElement === "undefined") {
1698  (function() {
1699    var TEMPLATE_TAG = "template";
1700    HTMLTemplateElement = function() {};
1701    HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
1702    HTMLTemplateElement.decorate = function(template) {
1703      if (!template.content) {
1704        template.content = template.ownerDocument.createDocumentFragment();
1705        var child;
1706        while (child = template.firstChild) {
1707          template.content.appendChild(child);
1708        }
1709      }
1710    };
1711    HTMLTemplateElement.bootstrap = function(doc) {
1712      var templates = doc.querySelectorAll(TEMPLATE_TAG);
1713      for (var i = 0, l = templates.length, t; i < l && (t = templates[i]); i++) {
1714        HTMLTemplateElement.decorate(t);
1715      }
1716    };
1717    addEventListener("DOMContentLoaded", function() {
1718      HTMLTemplateElement.bootstrap(document);
1719    });
1720  })();
1721}
1722
1723(function(scope) {
1724  var style = document.createElement("style");
1725  style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n";
1726  var head = document.querySelector("head");
1727  head.insertBefore(style, head.firstChild);
1728})(window.WebComponents);