[
  {
    "path": ".gitignore",
    "content": ".DS_Store\nnode_modules/\nNOTES.md"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2011-2014 Hongchan Choi.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# WAAX\n\nWeb Audio API eXtension (1.0.0-alpha3)\n\n> NOTE: WAAX requires Web Audio API and Web Components.\n\n<!-- travis build image -->\n\n\n## Introduction\n\n__WAAX__ offers a comprehensive framework for web-based music application. Its goal is to facilitate and support the development of web-based music software.\n\n\n## Feature Highlights\n\n- **Fast** - Built around native Web Audio API nodes.\n- **Less code**\n    - Web Audio API helpers and utilities\n    - Succint parameter control\n    - Transport and event management (i.e. sequencer)\n- **Modular and extensible**\n    - WAPL (Web Audio PLug-in): Plug-in for Web Audio API ecosystem\n    - MUI (Musical User Interface): GUI for music apps\n- **Robust workflow** - Preconfigured with Bower and Gulp\n\n\n## Prerequisites\n\nThe complete WAAX development setup requires the following software. Make sure they are installed with appropriate scope and permission.\n\n- [Git](http://git-scm.com/) - [Installation](http://git-scm.com/downloads)\n- [Node.js](http://nodejs.org/) - [Installation](http://nodejs.org/)\n- [Gulp](http://gulpjs.com/) - [Installation](https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md)\n\n\n## Installation and Quick Start\n\nIf you have all the above installed, execute the following commands in the terminal to install and launch WAAX.\n\n~~~bash\ngit clone https://github.com/hoch/WAAX waax\ncd waax\nnpm install\ngulp\n~~~\n\nNote that WAAX is pre-configured for the optimum development workflow. Type `gulp` in the terminal and then your web browser (Chrome by default) will open the project index page automatically.\n\n\n## What's Next?\n\nGo to the [project landing page](http://hoch.github.io/WAAX) and see what WAAX can do.\n\n\n## Change Log\n\n- 1.0.0-alpha3\n    + Updated dependencies with latest version: Polymer, Gulp-related utilities.\n    + mui-vkey polyphonic release issue solved.\n    + WXS-1 monophonic legato behavior fixed.\n    + New project landing page and API reference are online.\n    + Using MUI package is significantly simplified.\n    + `bower_components` are now part of MUI package, not WAAX.\n    + License for sound resources is added.\n\n- 1.0.0-alpha2\n    + Updated dependencies with latest version: Gulp, Polymer.\n    + MUI elements updated for new version of Polymer.\n    + Timebase code has been cleaned/refactored.\n    + Updated README and the temporary landing page is removed.\n    + MUI elements and test files are now compatible with FireFox/Safari.\n    + Audio assets are converted to MP3.\n    - [bug] `WXS1` and `FMK1` plug-ins produce distorted sound in FireFox.\n    - [bug] Safari does not load the example with `StereoDelay` plug-in.\n\n- 1.0.0-alpha\n    + First alpha version before stable release.\n    + Dropped deprecated components from repository.\n    + New plug-in builder introduced.\n\n- r17 (dev)\n    + Last version of dev/experimental revision.\n\n\n## License and Contact\n\nMIT License. Copyright 2011-2014 [Hongchan Choi](http://www.hoch.io)"
  },
  {
    "path": "build/mui/bower_components/core-component-page/README.md",
    "content": "core-component-page\n===================\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-component-page) for more information.\n\nNote: this is the vulcanized version of [`core-component-page-dev`](https://github.com/Polymer/core-component-page-dev) (the source).\n"
  },
  {
    "path": "build/mui/bower_components/core-component-page/bower.json",
    "content": "{\n  \"name\": \"core-component-page\",\n  \"private\": true,\n  \"dependencies\": {\n    \"webcomponentsjs\": \"Polymer/webcomponentsjs#^0.5.0\",\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "build/mui/bower_components/core-component-page/core-component-page.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<style>body{margin:0}</style>\n\n<div hidden><link rel=\"import\" href=\"../polymer/polymer.html\"><polymer-element name=\"core-meta\" attributes=\"label type\" hidden assetpath=\"../core-meta/\"><script>(function(){var SKIP_ID=\"meta\";var metaData={},metaArray={};Polymer(\"core-meta\",{type:\"default\",alwaysPrepare:true,ready:function(){this.register(this.id)},get metaArray(){var t=this.type;if(!metaArray[t]){metaArray[t]=[]}return metaArray[t]},get metaData(){var t=this.type;if(!metaData[t]){metaData[t]={}}return metaData[t]},register:function(id,old){if(id&&id!==SKIP_ID){this.unregister(this,old);this.metaData[id]=this;this.metaArray.push(this)}},unregister:function(meta,id){delete this.metaData[id||meta.id];var i=this.metaArray.indexOf(meta);if(i>=0){this.metaArray.splice(i,1)}},get list(){return this.metaArray},byId:function(id){return this.metaData[id]}})})();</script></polymer-element><polymer-element name=\"core-iconset\" extends=\"core-meta\" attributes=\"src width icons iconSize\" assetpath=\"../core-iconset/\"><script>Polymer(\"core-iconset\",{src:\"\",width:0,icons:\"\",iconSize:24,offsetX:0,offsetY:0,type:\"iconset\",created:function(){this.iconMap={};this.iconNames=[];this.themes={}},ready:function(){if(this.src&&this.ownerDocument!==document){this.src=this.resolvePath(this.src,this.ownerDocument.baseURI)}this.super();this.updateThemes()},iconsChanged:function(){var ox=this.offsetX;var oy=this.offsetY;this.icons&&this.icons.split(/\\s+/g).forEach(function(name,i){this.iconNames.push(name);this.iconMap[name]={offsetX:ox,offsetY:oy};if(ox+this.iconSize<this.width){ox+=this.iconSize}else{ox=this.offsetX;oy+=this.iconSize}},this)},updateThemes:function(){var ts=this.querySelectorAll(\"property[theme]\");ts&&ts.array().forEach(function(t){this.themes[t.getAttribute(\"theme\")]={offsetX:parseInt(t.getAttribute(\"offsetX\"))||0,offsetY:parseInt(t.getAttribute(\"offsetY\"))||0}},this)},getOffset:function(icon,theme){var i=this.iconMap[icon];if(!i){var n=this.iconNames[Number(icon)];i=this.iconMap[n]}var t=this.themes[theme];if(i&&t){return{offsetX:i.offsetX+t.offsetX,offsetY:i.offsetY+t.offsetY}}return i},applyIcon:function(element,icon,scale){var offset=this.getOffset(icon);scale=scale||1;if(element&&offset){var icon=element._icon||document.createElement(\"div\");var style=icon.style;style.backgroundImage=\"url(\"+this.src+\")\";style.backgroundPosition=-offset.offsetX*scale+\"px\"+\" \"+(-offset.offsetY*scale+\"px\");style.backgroundSize=scale===1?\"auto\":this.width*scale+\"px\";if(icon.parentNode!==element){element.appendChild(icon)}return icon}}});</script></polymer-element><style shim-shadowdom=\"\">html /deep/ core-icon{display:inline-block;vertical-align:middle;background-repeat:no-repeat;fill:currentcolor;position:relative;height:24px;width:24px}</style><polymer-element name=\"core-icon\" attributes=\"src icon alt\" assetpath=\"../core-icon/\"><script>(function(){var meta;Polymer(\"core-icon\",{src:\"\",icon:\"\",alt:null,observe:{icon:\"updateIcon\",alt:\"updateAlt\"},defaultIconset:\"icons\",ready:function(){if(!meta){meta=document.createElement(\"core-iconset\")}if(this.hasAttribute(\"aria-label\")){if(!this.hasAttribute(\"role\")){this.setAttribute(\"role\",\"img\")}return}this.updateAlt()},srcChanged:function(){var icon=this._icon||document.createElement(\"div\");icon.textContent=\"\";icon.setAttribute(\"fit\",\"\");icon.style.backgroundImage=\"url(\"+this.src+\")\";icon.style.backgroundPosition=\"center\";icon.style.backgroundSize=\"100%\";if(!icon.parentNode){this.appendChild(icon)}this._icon=icon},getIconset:function(name){return meta.byId(name||this.defaultIconset)},updateIcon:function(oldVal,newVal){if(!this.icon){this.updateAlt();return}var parts=String(this.icon).split(\":\");var icon=parts.pop();if(icon){var set=this.getIconset(parts.pop());if(set){this._icon=set.applyIcon(this,icon);if(this._icon){this._icon.setAttribute(\"fit\",\"\")}}}if(oldVal){if(oldVal.split(\":\").pop()==this.getAttribute(\"aria-label\")){this.updateAlt()}}},updateAlt:function(){if(this.getAttribute(\"aria-hidden\")){return}if(this.alt===\"\"){this.setAttribute(\"aria-hidden\",\"true\");if(this.hasAttribute(\"role\")){this.removeAttribute(\"role\")}if(this.hasAttribute(\"aria-label\")){this.removeAttribute(\"aria-label\")}}else{this.setAttribute(\"aria-label\",this.alt||this.icon.split(\":\").pop());if(!this.hasAttribute(\"role\")){this.setAttribute(\"role\",\"img\")}if(this.hasAttribute(\"aria-hidden\")){this.removeAttribute(\"aria-hidden\")}}}})})();</script></polymer-element><polymer-element name=\"core-iconset-svg\" extends=\"core-meta\" attributes=\"iconSize\" assetpath=\"../core-iconset-svg/\"><script>Polymer(\"core-iconset-svg\",{iconSize:24,type:\"iconset\",created:function(){this._icons={}},ready:function(){this.super();this.updateIcons()},iconById:function(id){return this._icons[id]||(this._icons[id]=this.querySelector(\"#\"+id))},cloneIcon:function(id){var icon=this.iconById(id);if(icon){var content=icon.cloneNode(true);content.removeAttribute(\"id\");var svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");svg.setAttribute(\"viewBox\",\"0 0 \"+this.iconSize+\" \"+this.iconSize);svg.style.pointerEvents=\"none\";svg.appendChild(content);return svg}},get iconNames(){if(!this._iconNames){this._iconNames=this.findIconNames()}return this._iconNames},findIconNames:function(){var icons=this.querySelectorAll(\"[id]\").array();if(icons.length){return icons.map(function(n){return n.id})}},applyIcon:function(element,icon){var root=element;var old=root.querySelector(\"svg\");if(old){old.remove()}var svg=this.cloneIcon(icon);if(!svg){return}svg.setAttribute(\"height\",\"100%\");svg.setAttribute(\"width\",\"100%\");svg.setAttribute(\"preserveAspectRatio\",\"xMidYMid meet\");svg.style.display=\"block\";root.insertBefore(svg,root.firstElementChild);return svg},updateIcons:function(selector,method){selector=selector||\"[icon]\";method=method||\"updateIcon\";var deep=window.ShadowDOMPolyfill?\"\":\"html /deep/ \";var i$=document.querySelectorAll(deep+selector);for(var i=0,e;e=i$[i];i++){if(e[method]){e[method].call(e)}}}});</script></polymer-element><core-iconset-svg id=\"icons\" iconsize=\"24\"><svg><defs><g id=\"accessibility\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6h-2v-13h-6v-2h18v2z\"/></g><g id=\"account-balance\"><path d=\"M4 10v7h3v-7h-3zm6 0v7h3v-7h-3zm-8 12h19v-3h-19v3zm14-12v7h3v-7h-3zm-4.5-9l-9.5 5v2h19v-2l-9.5-5z\"/></g><g id=\"account-balance-wallet\"><path d=\"M21 18v1c0 1.1-.9 2-2 2h-14c-1.11 0-2-.9-2-2v-14c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10v-8h-10v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g><g id=\"account-box\"><path d=\"M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-14c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1h-12v-1z\"/></g><g id=\"account-child\"><path d=\"M16.5 12c1.38 0 2.49-1.12 2.49-2.5s-1.11-2.5-2.49-2.5c-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5zm-7.5-1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75v2.25h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zm-7.5-1c-2.33 0-7 1.17-7 3.5v2.5h7v-2.25c0-.85.33-2.34 2.37-3.47-.87-.18-1.71-.28-2.37-.28z\"/></g><g id=\"account-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\"/></g><g id=\"add-box\"><path d=\"M19 3h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g><g id=\"add-circle-outline\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g><g id=\"add-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g><g id=\"add\"><path d=\"M19 13h-6v6h-2v-6h-6v-2h6v-6h2v6h6v2z\"/></g><g id=\"add-shopping-cart\"><path d=\"M11 9h2v-3h3v-2h-3v-3h-2v3h-3v2h3v3zm-4 9c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm10 0c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-9.83-3.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.86-7.01-1.74-.96h-.01l-1.1 2-2.76 5h-7.02l-.13-.27-2.24-4.73-.95-2-.94-2h-3.27v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.13 0-.25-.11-.25-.25z\"/></g><g id=\"alarm-add\"><path d=\"M7.88 3.39l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm14.12 2.33l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-10-1.72c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\"/></g><g id=\"alarm-off\"><path d=\"M12 6c3.87 0 7 3.13 7 7 0 .84-.16 1.65-.43 2.4l1.52 1.52c.58-1.19.91-2.51.91-3.92 0-4.97-4.03-9-9-9-1.41 0-2.73.33-3.92.91l1.52 1.52c.75-.27 1.56-.43 2.4-.43zm10-.28l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-19.08-3.43l-1.27 1.28 1.33 1.33-1.11.93 1.42 1.42 1.11-.94.8.8c-1.37 1.58-2.2 3.64-2.2 5.89 0 4.97 4.02 9 9 9 2.25 0 4.31-.83 5.89-2.2l2.2 2.2 1.27-1.27-17.47-17.46-.97-.98zm13.55 16.1c-1.21 1-2.77 1.61-4.47 1.61-3.87 0-7-3.13-7-7 0-1.7.61-3.26 1.61-4.47l9.86 9.86zm-8.45-15.11l-1.42-1.42-.86.71 1.42 1.42.86-.71z\"/></g><g id=\"alarm-on\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.12.61c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-1.46-5.47l-2.13-2.13-1.06 1.06 3.18 3.18 6-6-1.06-1.06-4.93 4.95z\"/></g><g id=\"alarm\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.62 4.61h-1.5v6l4.75 2.85.75-1.23-4-2.37v-5.25zm-.5-4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g><g id=\"android\"><path d=\"M6 18c0 .55.45 1 1 1h1v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h2v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h1c.55 0 1-.45 1-1v-10h-12v10zm-2.5-10c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm17 0c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm-4.97-5.84l1.3-1.3c.2-.2.2-.51 0-.71-.2-.2-.51-.2-.71 0l-1.48 1.48c-.79-.4-1.69-.63-2.64-.63-.96 0-1.86.23-2.66.63l-1.49-1.48c-.2-.2-.51-.2-.71 0-.2.2-.2.51 0 .71l1.31 1.31c-1.48 1.09-2.45 2.84-2.45 4.83h12c0-1.99-.97-3.75-2.47-4.84zm-5.53 2.84h-1v-1h1v1zm5 0h-1v-1h1v1z\"/></g><g id=\"announcement\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7 9h-2v-6h2v6zm0 4h-2v-2h2v2z\"/></g><g id=\"apps\"><path d=\"M4 8h4v-4h-4v4zm6 12h4v-4h-4v4zm-6 0h4v-4h-4v4zm0-6h4v-4h-4v4zm6 0h4v-4h-4v4zm6-10v4h4v-4h-4zm-6 4h4v-4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"/></g><g id=\"archive\"><path d=\"M20.54 5.23l-1.39-1.68c-.27-.34-.68-.55-1.15-.55h-12c-.47 0-.88.21-1.16.55l-1.38 1.68c-.29.34-.46.79-.46 1.27v12.5c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12.5c0-.48-.17-.93-.46-1.27zm-8.54 12.27l-5.5-5.5h3.5v-2h4v2h3.5l-5.5 5.5zm-6.88-12.5l.81-1h12l.94 1h-13.75z\"/></g><g id=\"arrow-back\"><path d=\"M20 11h-12.17l5.59-5.59-1.42-1.41-8 8 8 8 1.41-1.41-5.58-5.59h12.17v-2z\"/></g><g id=\"arrow-drop-down-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 12l-4-4h8l-4 4z\"/></g><g id=\"arrow-drop-down\"><path d=\"M7 10l5 5 5-5z\"/></g><g id=\"arrow-drop-up\"><path d=\"M7 14l5-5 5 5z\"/></g><g id=\"arrow-forward\"><path d=\"M12 4l-1.41 1.41 5.58 5.59h-12.17v2h12.17l-5.58 5.59 1.41 1.41 8-8z\"/></g><g id=\"aspect-ratio\"><path d=\"M19 12h-2v3h-3v2h5v-5zm-12-3h3v-2h-5v5h2v-3zm14-6h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g><g id=\"assessment\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g><g id=\"assignment-ind\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 4c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1.4c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1.4z\"/></g><g id=\"assignment-late\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6 15h-2v-2h2v2zm0-4h-2v-6h2v6zm-1-9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g><g id=\"assignment\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14h-7v-2h7v2zm3-4h-10v-2h10v2zm0-4h-10v-2h10v2z\"/></g><g id=\"assignment-returned\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3v-4h4v4h3l-5 5z\"/></g><g id=\"assignment-return\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm4 12h-4v3l-5-5 5-5v3h4v4z\"/></g><g id=\"assignment-turned-in\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-2 14l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g><g id=\"attachment\"><path d=\"M7.5 18c-3.04 0-5.5-2.46-5.5-5.5s2.46-5.5 5.5-5.5h10.5c2.21 0 4 1.79 4 4s-1.79 4-4 4h-8.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5h7.5v1.5h-7.5c-.55 0-1 .45-1 1s.45 1 1 1h8.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5h-10.5c-2.21 0-4 1.79-4 4s1.79 4 4 4h9.5v1.5h-9.5z\"/></g><g id=\"autorenew\"><path d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26l1.46-1.46c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74l-1.46 1.46c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"/></g><g id=\"backspace\"><path d=\"M22 3h-15c-.69 0-1.23.35-1.59.88l-5.41 8.12 5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-3 12.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g><g id=\"backup\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g><g id=\"block\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-8 10c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69l-11.21 11.21c-1.06-1.35-1.69-3.05-1.69-4.9zm8 8c-1.85 0-3.55-.63-4.9-1.69l11.21-11.21c1.06 1.35 1.69 3.05 1.69 4.9 0 4.42-3.58 8-8 8z\"/></g><g id=\"bookmark-outline\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g><g id=\"bookmark\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g><g id=\"book\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g><g id=\"bug-report\"><path d=\"M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96l1.63-1.63-1.41-1.41-2.17 2.17c-.46-.11-.93-.17-1.42-.17-.49 0-.96.06-1.41.17l-2.18-2.17-1.41 1.41 1.62 1.63c-.74.51-1.36 1.18-1.81 1.96h-2.81v2h2.09c-.05.33-.09.66-.09 1v1h-2v2h2v1c0 .34.04.67.09 1h-2.09v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3h2.81v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1h2.09v-2zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z\"/></g><g id=\"cached\"><path d=\"M19 8l-4 4h3c0 3.31-2.69 6-6 6-1.01 0-1.97-.25-2.8-.7l-1.46 1.46c1.23.78 2.69 1.24 4.26 1.24 4.42 0 8-3.58 8-8h3l-4-4zm-13 4c0-3.31 2.69-6 6-6 1.01 0 1.97.25 2.8.7l1.46-1.46c-1.23-.78-2.69-1.24-4.26-1.24-4.42 0-8 3.58-8 8h-3l4 4 4-4h-3z\"/></g><g id=\"cancel\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm5 13.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g><g id=\"check-box-outline-blank\"><path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></g><g id=\"check-box\"><path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></g><g id=\"check\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g><g id=\"chevron-left\"><path d=\"M15.41 7.41l-1.41-1.41-6 6 6 6 1.41-1.41-4.58-4.59z\"/></g><g id=\"chevron-right\"><path d=\"M10 6l-1.41 1.41 4.58 4.59-4.58 4.59 1.41 1.41 6-6z\"/></g><g id=\"class\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g><g id=\"clear\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g><g id=\"close\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g><g id=\"cloud-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm4.5 14h-8.5c-1.66 0-3-1.34-3-3s1.34-3 3-3l.14.01c.44-1.73 1.99-3.01 3.86-3.01 2.21 0 4 1.79 4 4h.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5z\"/></g><g id=\"cloud-done\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-9.35 6.96l-3.5-3.5 1.41-1.41 2.09 2.08 5.18-5.17 1.41 1.41-6.59 6.59z\"/></g><g id=\"cloud-download\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-2.35 2.96l-5 5-5-5h3v-4h4v4h3z\"/></g><g id=\"cloud-off\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-1.48 0-2.85.43-4.01 1.17l1.46 1.46c.76-.4 1.63-.63 2.55-.63 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3 0 1.13-.64 2.11-1.56 2.62l1.45 1.45c1.27-.91 2.11-2.39 2.11-4.07 0-2.64-2.05-4.78-4.65-4.96zm-16.35-4.77l2.75 2.74c-3.19.14-5.75 2.76-5.75 5.99 0 3.31 2.69 6 6 6h11.73l2 2 1.27-1.27-16.73-16.73-1.27 1.27zm4.73 4.73l8 8h-9.73c-2.21 0-4-1.79-4-4s1.79-4 4-4h1.73z\"/></g><g id=\"cloud\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z\"/></g><g id=\"cloud-queue\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-.35 7.96h-13c-2.21 0-4-1.79-4-4s1.79-4 4-4h.71c.66-2.31 2.77-4 5.29-4 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3s-1.34 3-3 3z\"/></g><g id=\"cloud-upload\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g><g id=\"content-copy\"><path d=\"M16 1h-12c-1.1 0-2 .9-2 2v14h2v-14h12v-2zm3 4h-11c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-11v-14h11v14z\"/></g><g id=\"content-cut\"><path d=\"M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4s-4 1.79-4 4 1.79 4 4 4c.59 0 1.14-.13 1.64-.36l2.36 2.36-2.36 2.36c-.5-.23-1.05-.36-1.64-.36-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64l2.36-2.36 7 7h3v-1l-12.36-12.36zm-3.64.36c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zm7-9.5l-6 6 2 2 7-7v-1z\"/></g><g id=\"content-paste\"><path d=\"M19 2h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18h-14v-16h2v3h10v-3h2v16z\"/></g><g id=\"create\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g><g id=\"credit-card\"><path d=\"M4 12h16v6h-16z\"/><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g><g id=\"dashboard\"><path d=\"M3 13h8v-10h-8v10zm0 8h8v-6h-8v6zm10 0h8v-10h-8v10zm0-18v6h8v-6h-8z\"/></g><g id=\"delete\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-12h-12v12zm13-15h-3.5l-1-1h-5l-1 1h-3.5v2h14v-2z\"/></g><g id=\"description\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 16h-8v-2h8v2zm0-4h-8v-2h8v2zm-3-5v-5.5l5.5 5.5h-5.5z\"/></g><g id=\"developer-mode-tv\"><path d=\"M4 5h16v2h2v-2c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v2h2v-2zm3.55 8.83l-2.83-2.83 2.83-2.83-1.41-1.41-4.25 4.24 4.24 4.24 1.42-1.41zm12.45 3.17h-16v-2h-2v2c0 1.1.9 2 2 2h4v2h8v-2h4c1.1 0 1.99-.9 1.99-2v-2h-1.99v2zm2-6.01l-4.24-4.24-1.41 1.41 2.82 2.84-2.83 2.83 1.41 1.41 4.25-4.23v-.02z\"/></g><g id=\"dns\"><path d=\"M20 13h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm13-16h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g><g id=\"done-all\"><path d=\"M18 7l-1.41-1.41-6.34 6.34 1.41 1.41 6.34-6.34zm4.24-1.41l-10.58 10.58-4.18-4.17-1.41 1.41 5.59 5.59 12-12-1.42-1.41zm-21.83 7.82l5.59 5.59 1.41-1.41-5.58-5.59-1.42 1.41z\"/></g><g id=\"done\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g><g id=\"drafts\"><path d=\"M21.99 8c0-.72-.37-1.35-.94-1.7l-9.05-5.3-9.05 5.3c-.57.35-.95.98-.95 1.7v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2l-.01-10zm-9.99 5l-8.26-5.16 8.26-4.84 8.26 4.84-8.26 5.16z\"/></g><g id=\"drawer\"><path d=\"M20,4H4C2.8,4,2,4.8,2,6v12c0,1.2,0.8,2,2,2h16c1,0,2-0.8,2-2V6C22,4.8,21,4,20,4z M20,18h-6V6h6V18z\"/></g><g id=\"error\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-2h2v2zm0-4h-2v-6h2v6z\"/></g><g id=\"event\"><path d=\"M17 12h-5v5h5v-5zm-1-11v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-1v-2h-2zm3 18h-14v-11h14v11z\"/></g><g id=\"exit-to-app\"><path d=\"M10.09 15.59l1.41 1.41 5-5-5-5-1.41 1.41 2.58 2.59h-9.67v2h9.67l-2.58 2.59zm8.91-12.59h-14c-1.11 0-2 .9-2 2v4h2v-4h14v14h-14v-4h-2v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g><g id=\"expand-less\"><path d=\"M12 8l-6 6 1.41 1.41 4.59-4.58 4.59 4.58 1.41-1.41z\"/></g><g id=\"expand-more\"><path d=\"M16.59 8.59l-4.59 4.58-4.59-4.58-1.41 1.41 6 6 6-6z\"/></g><g id=\"explore\"><path d=\"M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zm0-8.9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm2.19 12.19l-8.19 3.81 3.81-8.19 8.19-3.81-3.81 8.19z\"/></g><g id=\"extension\"><path d=\"M20.5 11h-1.5v-4c0-1.1-.9-2-2-2h-4v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5h-4c-1.1 0-1.99.9-1.99 2v3.8h1.49c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7h-1.5v3.8c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7v1.5h3.8c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5z\"/></g><g id=\"face-unlock\"><path d=\"M14.69 17.1c-.74.58-1.7.9-2.69.9s-1.95-.32-2.69-.9c-.22-.17-.53-.13-.7.09-.17.22-.13.53.09.7.91.72 2.09 1.11 3.3 1.11s2.39-.39 3.31-1.1c.22-.17.26-.48.09-.7-.17-.23-.49-.26-.71-.1z\"/><circle cx=\"8.5\" cy=\"12.5\" r=\"1\"/><path d=\"M12 0c-6.63 0-12 5.37-12 12s5.37 12 12 12 12-5.37 12-12-5.37-12-12-12zm7.96 14.82c-1.09 3.74-4.27 6.46-8.04 6.46-3.78 0-6.96-2.72-8.04-6.47-1.19-.11-2.13-1.18-2.13-2.52 0-1.27.85-2.31 1.97-2.5 2.09-1.46 3.8-3.49 4.09-5.05v-.01c1.35 2.63 6.3 5.19 11.83 5.06l.3-.03c1.28 0 2.31 1.14 2.31 2.54 0 1.38-1.02 2.51-2.29 2.52z\"/><circle cx=\"15.5\" cy=\"12.5\" r=\"1\"/></g><g id=\"favorite-outline\"><path d=\"M16.5 3c-1.74 0-3.41.81-4.5 2.09-1.09-1.28-2.76-2.09-4.5-2.09-3.08 0-5.5 2.42-5.5 5.5 0 3.78 3.4 6.86 8.55 11.54l1.45 1.31 1.45-1.32c5.15-4.67 8.55-7.75 8.55-11.53 0-3.08-2.42-5.5-5.5-5.5zm-4.4 15.55l-.1.1-.1-.1c-4.76-4.31-7.9-7.16-7.9-10.05 0-2 1.5-3.5 3.5-3.5 1.54 0 3.04.99 3.57 2.36h1.87c.52-1.37 2.02-2.36 3.56-2.36 2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z\"/></g><g id=\"favorite\"><path d=\"M12 21.35l-1.45-1.32c-5.15-4.67-8.55-7.75-8.55-11.53 0-3.08 2.42-5.5 5.5-5.5 1.74 0 3.41.81 4.5 2.09 1.09-1.28 2.76-2.09 4.5-2.09 3.08 0 5.5 2.42 5.5 5.5 0 3.78-3.4 6.86-8.55 11.54l-1.45 1.31z\"/></g><g id=\"file-download\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g><g id=\"file-map\"><path d=\"M12 6.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm7-5.5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6.5 16h-1c-.95-4.09-3.99-5.84-3.99-9 0-2.49 2-4.5 4.49-4.5s4.51 2.01 4.51 4.5c0 3.16-3.06 4.91-4.01 9z\"/></g><g id=\"file-upload\"><path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2h-14z\"/></g><g id=\"filter-list\"><path d=\"M10 18h4v-2h-4v2zm-7-12v2h18v-2h-18zm3 7h12v-2h-12v2z\"/></g><g id=\"find-in-page\"><path d=\"M20 19.59v-11.59l-6-6h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84zm-11-6.59c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z\"/></g><g id=\"find-replace\"><path d=\"M11 6c1.38 0 2.63.56 3.54 1.46l-2.54 2.54h6v-6l-2.05 2.05c-1.27-1.27-3.02-2.05-4.95-2.05-3.53 0-6.43 2.61-6.92 6h2.02c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14h-2.02c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46l2.54-2.54h-6v6l2.05-2.05c1.27 1.27 3.02 2.05 4.95 2.05 1.55 0 2.98-.51 4.14-1.36l4.86 4.85 1.49-1.49-4.85-4.86z\"/></g><g id=\"flag\"><path d=\"M14.4 6l-.4-2h-9v17h2v-7h5.6l.4 2h7v-10z\"/></g><g id=\"flip-to-back\"><path d=\"M9 7h-2v2h2v-2zm0 4h-2v2h2v-2zm0-8c-1.11 0-2 .9-2 2h2v-2zm4 12h-2v2h2v-2zm6-12v2h2c0-1.1-.9-2-2-2zm-6 0h-2v2h2v-2zm-4 14v-2h-2c0 1.1.89 2 2 2zm10-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm-14-10h-2v12c0 1.1.89 2 2 2h12v-2h-12v-12zm10-2h2v-2h-2v2zm0 12h2v-2h-2v2z\"/></g><g id=\"flip-to-front\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm2 4v-2h-2c0 1.1.89 2 2 2zm-2-12h2v-2h-2v2zm12 12h2v-2h-2v2zm4-18h-10c-1.11 0-2 .9-2 2v10c0 1.1.89 2 2 2h10c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-10v-10h10v10zm-8 6h2v-2h-2v2zm-4 0h2v-2h-2v2z\"/></g><g id=\"folder-open\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-16v-10h16v10z\"/></g><g id=\"folder\"><path d=\"M10 4h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-8l-2-2z\"/></g><g id=\"folder-shared\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-5 3c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 8h-8v-1c0-1.33 2.67-2 4-2s4 .67 4 2v1z\"/></g><g id=\"forward\"><path d=\"M12 8v-4l8 8-8 8v-4h-8v-8z\"/></g><g id=\"fullscreen-exit\"><path d=\"M5 16h3v3h2v-5h-5v2zm3-8h-3v2h5v-5h-2v3zm6 11h2v-3h3v-2h-5v5zm2-11v-3h-2v5h5v-2h-3z\"/></g><g id=\"fullscreen\"><path d=\"M7 14h-2v5h5v-2h-3v-3zm-2-4h2v-3h3v-2h-5v5zm12 7h-3v2h5v-5h-2v3zm-3-12v2h3v3h2v-5h-5z\"/></g><g id=\"gesture\"><path d=\"M4.59 6.89c.7-.71 1.4-1.35 1.71-1.22.5.2 0 1.03-.3 1.52-.25.42-2.86 3.89-2.86 6.31 0 1.28.48 2.34 1.34 2.98.75.56 1.74.73 2.64.46 1.07-.31 1.95-1.4 3.06-2.77 1.21-1.49 2.83-3.44 4.08-3.44 1.63 0 1.65 1.01 1.76 1.79-3.78.64-5.38 3.67-5.38 5.37 0 1.7 1.44 3.09 3.21 3.09 1.63 0 4.29-1.33 4.69-6.1h2.46v-2.5h-2.47c-.15-1.65-1.09-4.2-4.03-4.2-2.25 0-4.18 1.91-4.94 2.84-.58.73-2.06 2.48-2.29 2.72-.25.3-.68.84-1.11.84-.45 0-.72-.83-.36-1.92.35-1.09 1.4-2.86 1.85-3.52.78-1.14 1.3-1.92 1.3-3.28 0-2.17-1.64-2.86-2.51-2.86-1.32 0-2.47 1-2.72 1.25-.36.36-.66.66-.88.93l1.75 1.71zm9.29 11.66c-.31 0-.74-.26-.74-.72 0-.6.73-2.2 2.87-2.76-.3 2.69-1.43 3.48-2.13 3.48z\"/></g><g id=\"get-app\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g><g id=\"grade\"><path d=\"M12 17.27l6.18 3.73-1.64-7.03 5.46-4.73-7.19-.61-2.81-6.63-2.81 6.63-7.19.61 5.46 4.73-1.64 7.03z\"/></g><g id=\"group-work\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-4 15.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zm1.5-9.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5-2.5-1.12-2.5-2.5zm6.5 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g><g id=\"help\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92c-.72.73-1.17 1.33-1.17 2.83h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2h-2c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\"/></g><g id=\"highlight-remove\"><path d=\"M14.59 8l-2.59 2.59-2.59-2.59-1.41 1.41 2.59 2.59-2.59 2.59 1.41 1.41 2.59-2.59 2.59 2.59 1.41-1.41-2.59-2.59 2.59-2.59-1.41-1.41zm-2.59-6c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g><g id=\"history\"><path opacity=\".9\" d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g><g id=\"home\"><path d=\"M10 20v-6h4v6h5v-8h3l-10-9-10 9h3v8z\"/></g><g id=\"https\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g><g id=\"inbox\"><path d=\"M19 3h-14.01c-1.1 0-1.98.9-1.98 2l-.01 14c0 1.1.89 2 1.99 2h14.01c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 12h-4c0 1.66-1.34 3-3 3s-3-1.34-3-3h-4.01v-10h14.01v10zm-3-5h-2v-3h-4v3h-2l4 4 4-4z\"/></g><g id=\"info-outline\"><path d=\"M11 17h2v-6h-2v6zm1-15c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-11h2v-2h-2v2z\"/></g><g id=\"info\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-6h2v6zm0-8h-2v-2h2v2z\"/></g><g id=\"input\"><path d=\"M21 3.01h-18c-1.1 0-2 .9-2 2v3.99h2v-4.01h18v14.03h-18v-4.02h-2v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zm-10 12.99l4-4-4-4v3h-10v2h10v3z\"/></g><g id=\"invert-colors\"><path d=\"M17.66 7.93l-5.66-5.66-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34 2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zm-5.66 11.66c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24s.62-3.11 1.76-4.24l4.24-4.25v14.49z\"/></g><g id=\"label-outline\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16zm-1.63 11.16h-11v-10h11l3.55 5-3.55 5z\"/></g><g id=\"label\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16z\"/></g><g id=\"language\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zm-6.92-3.96c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zm-7.74 9.96c-.16-.64-.26-1.31-.26-2s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2h-3.38zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8h-2.95c.96-1.66 2.49-2.93 4.33-3.56-.6 1.11-1.06 2.31-1.38 3.56zm3.97 11.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zm2.34-5.96h-4.68c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zm1.77-5.56c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z\"/></g><g id=\"launch\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g><g id=\"link\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4v-1.9h-4c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9h-4c-1.71 0-3.1-1.39-3.1-3.1zm4.1 1h8v-2h-8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4v1.9h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></g><g id=\"list\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm4 4h14v-2h-14v2zm0 4h14v-2h-14v2zm0-10v2h14v-2h-14z\"/></g><g id=\"lock-open\"><path d=\"M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2h-9.1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-12v-10h12v10z\"/></g><g id=\"lock-outline\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6-5.1c1.71 0 3.1 1.39 3.1 3.1v2h-6.1v-2h-.1c0-1.71 1.39-3.1 3.1-3.1zm6 17.1h-12v-10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></g><g id=\"lock\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g><g id=\"loyalty\"><path d=\"M21.41 11.58l-9-9c-.36-.36-.86-.58-1.41-.58h-7c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zm-15.91-4.58c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11.77 8.27l-4.27 4.27-4.27-4.27c-.45-.46-.73-1.08-.73-1.77 0-1.38 1.12-2.5 2.5-2.5.69 0 1.32.28 1.77.74l.73.72.73-.73c.45-.45 1.08-.73 1.77-.73 1.38 0 2.5 1.12 2.5 2.5 0 .69-.28 1.32-.73 1.77z\"/></g><g id=\"mail\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g><g id=\"markunread-mailbox\"><path d=\"M20 6h-10v6h-2v-8h6v-4h-8v6h-2c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2z\"/></g><g id=\"markunread\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g><g id=\"menu\"><path d=\"M3 18h18v-2h-18v2zm0-5h18v-2h-18v2zm0-7v2h18v-2h-18z\"/></g><g id=\"more-horiz\"><path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g><g id=\"more-vert\"><path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g><g id=\"note-add\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 14h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2zm-3-7v-5.5l5.5 5.5h-5.5z\"/></g><g id=\"open-in-browser\"><path d=\"M19 4h-14c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2h-4v-10h14v10h-4v2h4c1.1 0 2-.9 2-2v-12c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"/></g><g id=\"open-in-new\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g><g id=\"open-with\"><path d=\"M10 9h4v-3h3l-5-5-5 5h3v3zm-1 1h-3v-3l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3h-3l5 5 5-5h-3v-3z\"/></g><g id=\"pageview\"><path d=\"M11 8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8-5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-1.41 16l-3.83-3.83c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84-1.41 1.41z\"/></g><g id=\"payment\"><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g><g id=\"perm-camera-mic\"><path d=\"M20 5h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v-2.09c-2.83-.48-5-2.94-5-5.91h2c0 2.21 1.79 4 4 4s4-1.79 4-4h2c0 2.97-2.17 5.43-5 5.91v2.09h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-6 8c0 1.1-.9 2-2 2s-2-.9-2-2v-4c0-1.1.9-2 2-2s2 .9 2 2v4z\"/></g><g id=\"perm-contact-cal\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z\"/></g><g id=\"perm-data-setting\"><path d=\"M18.99 11.5c.34 0 .67.03 1 .07l.01-11.57-20 20h11.56c-.04-.33-.07-.66-.07-1 0-4.14 3.36-7.5 7.5-7.5zm3.71 7.99c.02-.16.04-.32.04-.49 0-.17-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.85-.49l-.19-1.32c-.01-.12-.12-.21-.24-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49 0 .17.01.33.03.49l-1.06.83c-.09.08-.12.21-.06.32l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.02.12.12.21.25.21h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.07-.83zm-3.71 1.01c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g><g id=\"perm-device-info\"><path d=\"M13 7h-2v2h2v-2zm0 4h-2v6h2v-6zm4-9.99l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g><g id=\"perm-identity\"><path d=\"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1-2.1-.94-2.1-2.1.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1h-12.2v-1.1c0-.64 3.13-2.1 6.1-2.1m0-10.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z\"/></g><g id=\"perm-media\"><path d=\"M2 6h-2v5h.01l-.01 9c0 1.1.9 2 2 2h18v-2h-18v-14zm20-2h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-15 11l4.5-6 3.5 4.51 2.5-3.01 3.5 4.5h-14z\"/></g><g id=\"perm-phone-msg\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-8-12.5v10l3-3h6v-7h-9z\"/></g><g id=\"perm-scan-wifi\"><path d=\"M12 3c-5.05 0-8.85 1.85-12 4.23l12 14.77 12-14.75c-3.15-2.38-6.95-4.25-12-4.25zm1 13h-2v-6h2v6zm-2-8v-2h2v2h-2z\"/></g><g id=\"picture-in-picture\"><path d=\"M19 7h-8v6h8v-6zm2-4h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.03h18v14.03z\"/></g><g id=\"polymer\"><path d=\"M19 4h-4l-7.89 12.63-2.61-4.63 4.5-8h-4l-4.5 8 4.5 8h4l7.89-12.63 2.61 4.63-4.5 8h4l4.5-8z\"/></g><g id=\"print\"><path d=\"M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11h-8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9h-12v4h12v-4z\"/></g><g id=\"query-builder\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g><g id=\"question-answer\"><path d=\"M21 6h-2v9h-13v2c0 .55.45 1 1 1h11l4 4v-15c0-.55-.45-1-1-1zm-4 6v-9c0-.55-.45-1-1-1h-13c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z\"/></g><g id=\"radio-button-off\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g><g id=\"radio-button-on\"><path d=\"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g><g id=\"receipt\"><path d=\"M18 17h-12v-2h12v2zm0-4h-12v-2h12v2zm0-4h-12v-2h12v2zm-15 13l1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5v-20l-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5v20z\"/></g><g id=\"redeem\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g><g id=\"redo\"><path d=\"M18.4 10.6c-1.85-1.61-4.25-2.6-6.9-2.6-4.65 0-8.58 3.03-9.96 7.22l2.36.78c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88l-3.62 3.62h9v-9l-3.6 3.6z\"/></g><g id=\"refresh\"><path d=\"M17.65 6.35c-1.45-1.45-3.44-2.35-5.65-2.35-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78l-3.22 3.22h7v-7l-2.35 2.35z\"/></g><g id=\"remove-circle-outline\"><path d=\"M7 11v2h10v-2h-10zm5-9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g><g id=\"remove-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-10v-2h10v2z\"/></g><g id=\"remove\"><path d=\"M19 13h-14v-2h14v2z\"/></g><g id=\"reorder\"><path d=\"M3,15h18v-2H3V15z M3,19h18v-2H3V19z M3,11h18V9H3V11z M3,5v2h18V5H3z\"/></g><g id=\"reply-all\"><path d=\"M7 8v-3l-7 7 7 7v-3l-4-4 4-4zm6 1v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g><g id=\"reply\"><path d=\"M10 9v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g><g id=\"report\"><path d=\"M15.73 3h-7.46l-5.27 5.27v7.46l5.27 5.27h7.46l5.27-5.27v-7.46l-5.27-5.27zm-3.73 14.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2v-6h2v6z\"/></g><g id=\"report-problem\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g><g id=\"restore\"><path d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g><g id=\"room\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g><g id=\"rotation-3d\"><path d=\"M7.52 21.48c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.81-1.33 1.32zm.89-6.52c-.19 0-.37-.03-.52-.08-.16-.06-.29-.13-.4-.24-.11-.1-.2-.22-.26-.37-.06-.14-.09-.3-.09-.47h-1.3c0 .36.07.68.21.95.14.27.33.5.56.69.24.18.51.32.82.41.3.1.62.15.96.15.37 0 .72-.05 1.03-.15.32-.1.6-.25.83-.44s.42-.43.55-.72c.13-.29.2-.61.2-.97 0-.19-.02-.38-.07-.56-.05-.18-.12-.35-.23-.51-.1-.16-.24-.3-.4-.43-.17-.13-.37-.23-.61-.31.2-.09.37-.2.52-.33.15-.13.27-.27.37-.42.1-.15.17-.3.22-.46.05-.16.07-.32.07-.48 0-.36-.06-.68-.18-.96-.12-.28-.29-.51-.51-.69-.2-.19-.47-.33-.77-.43-.31-.09-.65-.14-1.02-.14-.36 0-.69.05-1 .16-.3.11-.57.26-.79.45-.21.19-.38.41-.51.67-.12.26-.18.54-.18.85h1.3c0-.17.03-.32.09-.45s.14-.25.25-.34c.11-.09.23-.17.38-.22.15-.05.3-.08.48-.08.4 0 .7.1.89.31.19.2.29.49.29.86 0 .18-.03.34-.08.49-.05.15-.14.27-.25.37-.11.1-.25.18-.41.24-.16.06-.36.09-.58.09h-.77v1.03h.77c.22 0 .42.02.6.07s.33.13.45.23c.12.11.22.24.29.4.07.16.1.35.1.57 0 .41-.12.72-.35.93-.23.23-.55.33-.95.33zm8.55-5.92c-.32-.33-.7-.59-1.14-.77-.43-.18-.92-.27-1.46-.27h-2.36v8h2.3c.55 0 1.06-.09 1.51-.27.45-.18.84-.43 1.16-.76.32-.33.57-.73.74-1.19.17-.47.26-.99.26-1.57v-.4c0-.58-.09-1.1-.26-1.57-.18-.47-.43-.87-.75-1.2zm-.39 3.16c0 .42-.05.79-.14 1.13-.1.33-.24.62-.43.85-.19.23-.43.41-.71.53-.29.12-.62.18-.99.18h-.91v-5.77h.97c.72 0 1.27.23 1.64.69.38.46.57 1.12.57 1.99v.4zm-4.57-12.2l-.66.03 3.81 3.81 1.33-1.33c3.27 1.55 5.61 4.72 5.96 8.48h1.5c-.5-6.15-5.65-10.99-11.94-10.99z\"/></g><g id=\"save\"><path d=\"M17 3h-12c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-12l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10h-10v-4h10v4z\"/></g><g id=\"schedule\"><path fill-opacity=\".9\" d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path fill-opacity=\".9\" d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g><g id=\"search\"><path d=\"M15.5 14h-.79l-.28-.27c.98-1.14 1.57-2.62 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 2.91-6.5 6.5 2.91 6.5 6.5 6.5c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99 1.49-1.49-4.99-5zm-6 0c-2.49 0-4.5-2.01-4.5-4.5s2.01-4.5 4.5-4.5 4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5z\"/></g><g id=\"select-all\"><path d=\"M3 5h2v-2c-1.1 0-2 .9-2 2zm0 8h2v-2h-2v2zm4 8h2v-2h-2v2zm-4-12h2v-2h-2v2zm10-6h-2v2h2v-2zm6 0v2h2c0-1.1-.9-2-2-2zm-14 18v-2h-2c0 1.1.9 2 2 2zm-2-4h2v-2h-2v2zm6-14h-2v2h2v-2zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2v-2h-2v2zm-8 12h10v-10h-10v10zm2-8h6v6h-6v-6z\"/></g><g id=\"send-money\"><path d=\"M2 12c0-2.61 1.67-4.83 4-5.65v-2.09c-3.45.89-6 4.01-6 7.74s2.55 6.85 6 7.74v-2.09c-2.33-.82-4-3.04-4-5.65zm22 0l-4-4v3h-7v2h7v3l4-4zm-10 6c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.16.67 4.24 1.76l1.42-1.41c-1.45-1.45-3.45-2.35-5.66-2.35-4.42 0-8 3.58-8 8s3.58 8 8 8c2.21 0 4.21-.9 5.66-2.34l-1.42-1.41c-1.08 1.08-2.58 1.75-4.24 1.75z\"/></g><g id=\"send\"><path d=\"M2.01 21l20.99-9-20.99-9-.01 7 15 2-15 2z\"/></g><g id=\"settings-applications\"><path d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm7-7h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2v-14c0-1.1-.89-2-2-2zm-1.75 9c0 .23-.02.46-.05.68l1.48 1.16c.13.11.17.3.08.45l-1.4 2.42c-.09.15-.27.21-.43.15l-1.74-.7c-.36.28-.76.51-1.18.69l-.26 1.85c-.03.17-.18.3-.35.3h-2.8c-.17 0-.32-.13-.35-.29l-.26-1.85c-.43-.18-.82-.41-1.18-.69l-1.74.7c-.16.06-.34 0-.43-.15l-1.4-2.42c-.09-.15-.05-.34.08-.45l1.48-1.16c-.03-.23-.05-.46-.05-.69 0-.23.02-.46.05-.68l-1.48-1.16c-.13-.11-.17-.3-.08-.45l1.4-2.42c.09-.15.27-.21.43-.15l1.74.7c.36-.28.76-.51 1.18-.69l.26-1.85c.03-.17.18-.3.35-.3h2.8c.17 0 .32.13.35.29l.26 1.85c.43.18.82.41 1.18.69l1.74-.7c.16-.06.34 0 .43.15l1.4 2.42c.09.15.05.34-.08.45l-1.48 1.16c.03.23.05.46.05.69z\"/></g><g id=\"settings-backup-restore\"><path d=\"M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9h-3l4 4 4-4h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44c1.52 1.16 3.42 1.86 5.48 1.86 4.97 0 9-4.03 9-9s-4.03-9-9-9z\"/></g><g id=\"settings-bluetooth\"><path d=\"M11 24h2v-2h-2v2zm-4 0h2v-2h-2v2zm8 0h2v-2h-2v2zm2.71-18.29l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g><g id=\"settings-cell\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm1-23.99l-8-.01c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-16c0-1.1-.9-1.99-2-1.99zm0 15.99h-8v-12h8v12z\"/></g><g id=\"settings-display\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02zm-13-3.01h2.5l1.5 1.5 1.5-1.5h2.5v-2.5l1.5-1.5-1.5-1.5v-2.5h-2.5l-1.5-1.5-1.5 1.5h-2.5v2.5l-1.5 1.5 1.5 1.5v2.5zm4-7c1.66 0 3 1.34 3 3s-1.34 3-3 3v-6z\"/></g><g id=\"settings-ethernet\"><path d=\"M7.77 6.76l-1.54-1.28-5.41 6.52 5.41 6.52 1.54-1.28-4.35-5.24 4.35-5.24zm-.77 6.24h2v-2h-2v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28 4.35 5.24-4.35 5.24 1.54 1.28 5.41-6.52-5.41-6.52z\"/></g><g id=\"settings-input-antenna\"><path d=\"M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5c0 1.02.62 1.9 1.5 2.29v3.3l-3.41 3.41 1.41 1.41 3-3 3 3 1.41-1.41-3.41-3.41v-3.3zm-1-13.29c-6.07 0-11 4.93-11 11h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z\"/></g><g id=\"settings-input-component\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g><g id=\"settings-input-composite\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g><g id=\"settings-input-hdmi\"><path d=\"M18 7v-3c0-1.1-.9-2-2-2h-8c-1.1 0-2 .9-2 2v3h-1v6l3 6v3h8v-3l3-6v-6h-1zm-10-3h8v3h-2v-2h-1v2h-2v-2h-1v2h-2v-3z\"/></g><g id=\"settings-input-svideo\"><path d=\"M8 11.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5.67 1.5 1.5 1.5 1.5-.67 1.5-1.5zm7-5c0-.83-.67-1.5-1.5-1.5h-3c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5h3c.83 0 1.5-.67 1.5-1.5zm-6.5 8.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm3.5-14c-6.07 0-11 4.93-11 11s4.93 11 11 11 11-4.93 11-11-4.93-11-11-11zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9zm5.5-11c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm-2 5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"/></g><g id=\"settings-overscan\"><path d=\"M12.01 5.5l-2.01 2.5h4l-1.99-2.5zm5.99 4.5v4l2.5-1.99-2.5-2.01zm-12 0l-2.5 2.01 2.5 1.99v-4zm8 6h-4l2.01 2.5 1.99-2.5zm7-13h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g><g id=\"settings\"><path d=\"M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65c-.03-.24-.24-.42-.49-.42h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zm-7.43 2.52c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g><g id=\"settings-phone\"><path d=\"M13 9h-2v2h2v-2zm4 0h-2v2h2v-2zm3 6.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-6.5v2h2v-2h-2z\"/></g><g id=\"settings-power\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm2-22h-2v10h2v-10zm3.56 2.44l-1.45 1.45c1.73 1.05 2.89 2.94 2.89 5.11 0 3.31-2.69 6-6 6s-6-2.69-6-6c0-2.17 1.16-4.06 2.88-5.12l-1.44-1.44c-2.08 1.44-3.44 3.84-3.44 6.56 0 4.42 3.58 8 8 8s8-3.58 8-8c0-2.72-1.36-5.12-3.44-6.56zm-1.56 19.56h2v-2h-2v2z\"/></g><g id=\"settings-remote\"><path d=\"M15 9h-6c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-3 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm-4.95-8.95l1.41 1.41c.91-.9 2.16-1.46 3.54-1.46s2.63.56 3.54 1.46l1.41-1.41c-1.27-1.27-3.02-2.05-4.95-2.05s-3.68.78-4.95 2.05zm4.95-6.05c-3.04 0-5.79 1.23-7.78 3.22l1.41 1.41c1.63-1.62 3.88-2.63 6.37-2.63s4.74 1.01 6.36 2.64l1.41-1.41c-1.98-2-4.73-3.23-7.77-3.23z\"/></g><g id=\"settings-voice\"><path d=\"M7 24h2v-2h-2v2zm5-11c1.66 0 2.99-1.34 2.99-3l.01-6c0-1.66-1.34-3-3-3s-3 1.34-3 3v6c0 1.66 1.34 3 3 3zm-1 11h2v-2h-2v2zm4 0h2v-2h-2v2zm4-14h-1.7c0 3-2.54 5.1-5.3 5.1s-5.3-2.1-5.3-5.1h-1.7c0 3.41 2.72 6.23 6 6.72v3.28h2v-3.28c3.28-.49 6-3.31 6-6.72z\"/></g><g id=\"shop\"><path d=\"M16 6v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-6v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-13h-6zm-6-2h4v2h-4v-2zm-1 14v-9l7.5 4-7.5 5z\"/></g><g id=\"shopping-basket\"><path d=\"M17.21 9l-4.38-6.56c-.19-.28-.51-.42-.83-.42-.32 0-.64.14-.83.43l-4.38 6.55h-4.79c-.55 0-1 .45-1 1 0 .09.01.18.04.27l2.54 9.27c.23.84 1 1.46 1.92 1.46h13c.92 0 1.69-.62 1.93-1.46l2.54-9.27.03-.27c0-.55-.45-1-1-1h-4.79zm-8.21 0l3-4.4 3 4.4h-6zm3 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g><g id=\"shopping-cart\"><path d=\"M7 18c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-6-16v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1h-14.79l-.94-2h-3.27zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z\"/></g><g id=\"shop-two\"><path d=\"M3 9h-2v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2h-16v-11zm15-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-5v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2v-11h-5zm-6-2h4v2h-4v-2zm0 12v-7l5.5 3-5.5 4z\"/></g><g id=\"sort\"><path d=\"M3 18h6v-2h-6v2zm0-12v2h18v-2h-18zm0 7h12v-2h-12v2z\"/></g><g id=\"speaker-notes\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-12 12h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2v-2h2v2zm7 6h-5v-2h5v2zm3-3h-8v-2h8v2zm0-3h-8v-2h8v2z\"/></g><g id=\"spellcheck\"><path d=\"M12.45 16h2.09l-5.11-13h-1.86l-5.11 13h2.09l1.12-3h5.64l1.14 3zm-6.02-5l2.07-5.52 2.07 5.52h-4.14zm15.16.59l-8.09 8.09-3.67-3.68-1.41 1.41 5.09 5.09 9.49-9.5-1.41-1.41z\"/></g><g id=\"star-half\"><path d=\"M22 9.74l-7.19-.62L12 2.5 9.19 9.13 2 9.74l5.46 4.73-1.64 7.03L12 17.77l6.18 3.73-1.63-7.03L22 9.74zM12 15.9V6.6l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.9z\"/></g><g id=\"star-outline\"><path d=\"M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z\"/></g><g id=\"star\"><path d=\"M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"/></g><g id=\"star-rate\"><path d=\"M12 14.3l3.71 2.7-1.42-4.36 3.71-2.64h-4.55l-1.45-4.5-1.45 4.5h-4.55l3.71 2.64-1.42 4.36z\"/></g><g id=\"stars\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm4.24 16l-4.23-2.55-4.23 2.55 1.12-4.81-3.73-3.23 4.92-.42 1.92-4.54 1.92 4.53 4.92.42-3.73 3.23 1.12 4.82z\"/></g><g id=\"store\"><path d=\"M20 4h-16v2h16v-2zm1 10v-2l-1-5h-16l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4h-6v-4h6v4z\"/></g><g id=\"subject\"><path d=\"M14 17h-10v2h10v-2zm6-8h-16v2h16v-2zm-16 6h16v-2h-16v2zm0-10v2h16v-2h-16z\"/></g><g id=\"supervisor-account\"><circle cx=\"12\" cy=\"13.49\" r=\"1.5\"/><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 2.5c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25-2.25-1.01-2.25-2.25 1.01-2.25 2.25-2.25zm5 10.56v2.5c-.45.41-.96.77-1.5 1.05v-.68c0-.34-.17-.65-.46-.92-.65-.62-1.89-1.02-3.04-1.02-.96 0-1.96.28-2.65.73l-.17.12-.21.17c.78.47 1.63.72 2.54.82l1.33.15c.37.04.66.36.66.75 0 .29-.16.53-.4.66-.28.15-.64.09-.95.09-.35 0-.69-.01-1.03-.05-.5-.06-.99-.17-1.46-.33-.49-.16-.97-.38-1.42-.64-.22-.13-.44-.27-.65-.43l-.31-.24c-.04-.02-.28-.18-.28-.23v-4.28c0-1.58 2.63-2.78 5-2.78s5 1.2 5 2.78v1.78z\"/></g><g id=\"swap-horiz\"><path d=\"M6.99 11l-3.99 4 3.99 4v-3h7.01v-2h-7.01v-3zm14.01-2l-3.99-4v3h-7.01v2h7.01v3l3.99-4z\"/></g><g id=\"swap-vert-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-5.5 7l3.5-3.5 3.5 3.5h-2.5v4h-2v-4h-2.5zm11 6l-3.5 3.5-3.5-3.5h2.5v-4h2v4h2.5z\"/></g><g id=\"swap-vert\"><path d=\"M16 17.01v-7.01h-2v7.01h-3l4 3.99 4-3.99h-3zm-7-14.01l-4 3.99h3v7.01h2v-7.01h3l-4-3.99z\"/></g><g id=\"system-update-tv\"><path d=\"M12 16.5l4-4h-3v-9h-2v9h-3l4 4zm9-13h-6v1.99h6v14.03h-18v-14.03h6v-1.99h-6c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g><g id=\"tab\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-18v-14h10v4h8v10z\"/></g><g id=\"tab-unselected\"><path d=\"M1 9h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2c-1.1 0-2 .9-2 2zm8 16h2v-2h-2v2zm-8-4h2v-2h-2v2zm2 4v-2h-2c0 1.1.9 2 2 2zm18-18h-8v6h10v-4c0-1.1-.9-2-2-2zm0 14h2v-2h-2v2zm-12-12h2v-2h-2v2zm-4 16h2v-2h-2v2zm0-16h2v-2h-2v2zm16 16c1.1 0 2-.9 2-2h-2v2zm0-8h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 0h2v-2h-2v2z\"/></g><g id=\"text-format\"><path d=\"M5 17v2h14v-2h-14zm4.5-4.2h5l.9 2.2h2.1l-4.75-11h-1.5l-4.75 11h2.1l.9-2.2zm2.5-6.82l1.87 5.02h-3.74l1.87-5.02z\"/></g><g id=\"theaters\"><path d=\"M18 3v2h-2v-2h-8v2h-2v-2h-2v18h2v-2h2v2h8v-2h2v2h2v-18h-2zm-10 14h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g><g id=\"thumb-down\"><path d=\"M15 3h-9c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v1.91l.01.01-.01.08c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06l1.06 1.05 6.59-6.59c.36-.36.58-.86.58-1.41v-10c0-1.1-.9-2-2-2zm4 0v12h4v-12h-4z\"/></g><g id=\"thumbs-up-down\"><path d=\"M12 6c0-.55-.45-1-1-1h-5.18l.66-3.18.02-.23c0-.31-.13-.59-.33-.8l-.79-.79-4.94 4.94c-.27.27-.44.65-.44 1.06v6.5c0 .83.67 1.5 1.5 1.5h6.75c.62 0 1.15-.38 1.38-.91l2.26-5.29c.07-.17.11-.36.11-.55v-1.25zm10.5 4h-6.75c-.62 0-1.15.38-1.38.91l-2.26 5.29c-.07.17-.11.36-.11.55v1.25c0 .55.45 1 1 1h5.18l-.66 3.18-.02.24c0 .31.13.59.33.8l.79.78 4.94-4.94c.27-.27.44-.65.44-1.06v-6.5c0-.83-.67-1.5-1.5-1.5z\"/></g><g id=\"thumb-up\"><path d=\"M1 21h4v-12h-4v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06l-1.06-1.05-6.58 6.59c-.37.36-.59.86-.59 1.41v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01.01-.08z\"/></g><g id=\"toc\"><path d=\"M3 9h14v-2h-14v2zm0 4h14v-2h-14v2zm0 4h14v-2h-14v2zm16 0h2v-2h-2v2zm0-10v2h2v-2h-2zm0 6h2v-2h-2v2z\"/></g><g id=\"today\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11zm-12-9h5v5h-5z\"/></g><g id=\"track-changes\"><path d=\"M19.07 4.93l-1.41 1.41c1.44 1.45 2.34 3.45 2.34 5.66 0 4.42-3.58 8-8 8s-8-3.58-8-8c0-4.08 3.05-7.44 7-7.93v2.02c-2.84.48-5 2.94-5 5.91 0 3.31 2.69 6 6 6s6-2.69 6-6c0-1.66-.67-3.16-1.76-4.24l-1.41 1.41c.72.73 1.17 1.73 1.17 2.83 0 2.21-1.79 4-4 4s-4-1.79-4-4c0-1.86 1.28-3.41 3-3.86v2.14c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72v-8.28h-1c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10c0-2.76-1.12-5.26-2.93-7.07z\"/></g><g id=\"translate\"><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h2.93v-2h-7v-2h-2v2h-7v1.99h11.17c-.67 1.93-1.73 3.76-3.17 5.36-.93-1.03-1.7-2.16-2.31-3.35h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02 1.42 1.42 5-5 3.11 3.11.76-2.04zm5.63-5.07h-2l-4.5 12h2l1.12-3h4.75l1.13 3h2l-4.5-12zm-2.62 7l1.62-4.33 1.62 4.33h-3.24z\"/></g><g id=\"trending-down\"><path d=\"M16 18l2.29-2.29-4.88-4.88-4 4-7.41-7.42 1.41-1.41 6 6 4-4 6.3 6.29 2.29-2.29v6z\"/></g><g id=\"trending-neutral\"><path d=\"M22 12l-4-4v3h-15v2h15v3z\"/></g><g id=\"trending-up\"><path d=\"M16 6l2.29 2.29-4.88 4.88-4-4-7.41 7.42 1.41 1.41 6-6 4 4 6.3-6.29 2.29 2.29v-6z\"/></g><g id=\"turned-in-not\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g><g id=\"turned-in\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g><g id=\"undo\"><path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6l-3.6-3.6v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78c-1.39-4.19-5.32-7.22-9.97-7.22z\"/></g><g id=\"unfold-less\"><path d=\"M7.41 18.59l1.42 1.41 3.17-3.17 3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59zm9.18-13.18l-1.42-1.41-3.17 3.17-3.17-3.17-1.42 1.41 4.59 4.59 4.59-4.59z\"/></g><g id=\"unfold-more\"><path d=\"M12 5.83l3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59 1.42 1.41 3.17-3.17zm0 12.34l-3.17-3.17-1.41 1.41 4.58 4.59 4.59-4.59-1.42-1.41-3.17 3.17z\"/></g><g id=\"verified-user\"><path d=\"M12 1l-9 4v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12v-6l-9-4zm-2 16l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g><g id=\"view-agenda\"><path d=\"M20 13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm0-10h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1z\"/></g><g id=\"view-array\"><path d=\"M4 18h3v-13h-3v13zm14-13v13h3v-13h-3zm-10 13h9v-13h-9v13z\"/></g><g id=\"view-carousel\"><path d=\"M7 19h10v-15h-10v15zm-5-2h4v-11h-4v11zm16-11v11h4v-11h-4z\"/></g><g id=\"view-column\"><path d=\"M10 18h5v-13h-5v13zm-6 0h5v-13h-5v13zm12-13v13h5v-13h-5z\"/></g><g id=\"view-day\"><path d=\"M2 21h19v-3h-19v3zm18-13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-18-5v3h19v-3h-19z\"/></g><g id=\"view-headline\"><path d=\"M4 15h17v-2h-17v2zm0 4h17v-2h-17v2zm0-8h17v-2h-17v2zm0-6v2h17v-2h-17z\"/></g><g id=\"view-list\"><path d=\"M4 14h4v-4h-4v4zm0 5h4v-4h-4v4zm0-10h4v-4h-4v4zm5 5h12v-4h-12v4zm0 5h12v-4h-12v4zm0-14v4h12v-4h-12z\"/></g><g id=\"view-module\"><path d=\"M4 11h5v-6h-5v6zm0 7h5v-6h-5v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5v-6h-5v6zm6-6v6h5v-6h-5z\"/></g><g id=\"view-quilt\"><path d=\"M10 18h5v-6h-5v6zm-6 0h5v-13h-5v13zm12 0h5v-6h-5v6zm-6-13v6h11v-6h-11z\"/></g><g id=\"view-stream\"><path d=\"M4 18h17v-6h-17v6zm0-13v6h17v-6h-17z\"/></g><g id=\"view-week\"><path d=\"M6 5h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1z\"/></g><g id=\"visibility-off\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16c.57-.23 1.18-.36 1.83-.36zm-10-2.73l2.28 2.28.46.46c-1.66 1.29-2.96 3.01-3.74 4.99 1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42 2.93 2.92 1.27-1.27-17.73-17.73-1.27 1.27zm5.53 5.53l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></g><g id=\"visibility\"><path d=\"M12 4.5c-5 0-9.27 3.11-11 7.5 1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g><g id=\"wallet-giftcard\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g><g id=\"wallet-membership\"><path d=\"M20 2h-16c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h4v5l4-2 4 2v-5h4c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm0 13h-16v-2h16v2zm0-5h-16v-6h16v6z\"/></g><g id=\"wallet-travel\"><path d=\"M20 6h-3v-2c0-1.11-.89-2-2-2h-6c-1.11 0-2 .89-2 2v2h-3c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-11-2h6v2h-6v-2zm11 15h-16v-2h16v2zm0-5h-16v-6h3v2h2v-2h6v2h2v-2h3v6z\"/></g><g id=\"warning\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g><g id=\"work\"><path d=\"M24 0v24h-24v-24h24m1-1h-26v26h26v-26z\"/><path d=\"M20 6h-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-6 0h-4v-2h4v2z\"/></g></defs></svg></core-iconset-svg><polymer-element name=\"core-icon-button\" attributes=\"src icon active\" assetpath=\"../core-icon-button/\"><template><style>:host{display:inline-block;box-sizing:border-box;-moz-box-sizing:border-box;user-select:none;-moz-user-select:none;-webkit-user-select:none;border-radius:2px;padding:7px;margin:2px;vertical-align:middle;font-size:1rem;cursor:pointer}:host([disabled]){opacity:.6;pointer-events:none}:host(.outline){box-shadow:0 0 0 1px rgba(0,0,0,.1)}:host(:hover:not([disabled])){box-shadow:0 1px 0 0 rgba(0,0,0,.12),0 0 0 1px rgba(0,0,0,.1)}:host(.selected:not([disabled])){background-color:rgba(0,0,0,.05);box-shadow:inset 0 1px 0 0 rgba(0,0,0,.05),0 0 0 1px rgba(0,0,0,.12)}:host(:active:not([disabled]),.selected:active:not([disabled])){background-color:rgba(0,0,0,.05);box-shadow:inset 0 1px 0 0 rgba(0,0,0,.1),0 0 0 1px rgba(0,0,0,.12)}:host(.core-dark-theme.outline){background-color:rgba(200,200,200,.05);box-shadow:0 0 0 1px rgba(200,200,200,.1)}:host(.core-dark-theme:hover){background-color:rgba(200,200,200,.05);box-shadow:0 1px 0 0 rgba(200,200,200,.12),0 0 0 1px rgba(200,200,200,.1)}:host(.core-dark-theme.selected){background-color:rgba(220,220,220,.05);box-shadow:inset 0 1px 0 0 rgba(200,200,200,.05),0 0 0 1px rgba(200,200,200,.12)}:host(.core-dark-theme:active,.core-dark-theme.selected:active){background-color:rgba(200,200,200,.05);box-shadow:inset 0 1px 0 0 rgba(200,200,200,.1),0 0 0 1px rgba(200,200,200,.12)}core-icon{pointer-events:none}:host ::content>:not(core-icon){margin-left:4px}</style><core-icon src=\"{{src}}\" icon=\"{{icon}}\"></core-icon><content></content></template><script>Polymer(\"core-icon-button\",{src:\"\",active:false,icon:\"\",activeChanged:function(){this.classList.toggle(\"selected\",this.active)}});</script></polymer-element><polymer-element name=\"core-toolbar\" attributes=\"justify middleJustify bottomJustify\" assetpath=\"../core-toolbar/\"><template><style>:host{display:block;position:relative;box-sizing:border-box;-moz-box-sizing:border-box;height:64px;font-size:1.3em;background-color:#CFD8DC}:host(.animate){transition:height .18s ease-in}:host(.medium-tall){height:128px}:host(.tall){height:192px}.toolbar-tools{position:relative;height:64px;padding:0 8px;pointer-events:none}:host(.core-narrow),:host-context(.core-narrow){height:56px}polyfill-next-selector{content:':host.core-narrow.medium-tall, .core-narrow :host.medium-tall'}:host(.core-narrow.medium-tall),:host-context(.core-narrow):host(.medium-tall){height:112px}polyfill-next-selector{content:':host.core-narrow.tall, .core-narrow :host.tall'}:host(.core-narrow.tall),:host-context(.core-narrow):host(.tall){height:168px}polyfill-next-selector{content:':host.core-narrow .toolbar-tools, .core-narrow :host .toolbar-tools'}:host(.core-narrow) .toolbar-tools,:host-context(.core-narrow) .toolbar-tools{height:56px;padding:0}#middleBar{position:absolute;top:0;right:0;left:0}:host(.tall,.medium-tall) #middleBar{-webkit-transform:translateY(100%);transform:translateY(100%)}#bottomBar{position:absolute;right:0;bottom:0;left:0}polyfill-next-selector{content:'.toolbar-tools > *'}::content>*{pointer-events:auto}polyfill-next-selector{content:'.toolbar-tools > *'}::content>*{margin:0 8px}polyfill-next-selector{content:'.toolbar-tools > .fit'}::content>.fit{position:absolute;top:auto;right:0;bottom:0;left:0;width:auto;margin:0}polyfill-next-selector{content:':host .indent'}::content>.indent{margin-left:60px}</style><div id=\"bottomBar\" class=\"toolbar-tools\" center=\"\" horizontal=\"\" layout=\"\"><content select=\".bottom\"></content></div><div id=\"middleBar\" class=\"toolbar-tools\" center=\"\" horizontal=\"\" layout=\"\"><content select=\".middle\"></content></div><div id=\"topBar\" class=\"toolbar-tools\" center=\"\" horizontal=\"\" layout=\"\"><content></content></div></template><script>(function(){Polymer(\"core-toolbar\",{justify:\"\",middleJustify:\"\",bottomJustify:\"\",justifyChanged:function(old){this.updateBarJustify(this.$.topBar,this.justify,old)},middleJustifyChanged:function(old){this.updateBarJustify(this.$.middleBar,this.middleJustify,old)},bottomJustifyChanged:function(old){this.updateBarJustify(this.$.bottomBar,this.bottomJustify,old)},updateBarJustify:function(bar,justify,old){if(old){bar.removeAttribute(this.toLayoutAttrName(old))}if(this.justify){bar.setAttribute(this.toLayoutAttrName(justify),\"\")}},toLayoutAttrName:function(value){return value===\"between\"?\"justified\":value+\"-justified\"}})})();</script></polymer-element><polymer-element name=\"core-header-panel\" assetpath=\"../core-header-panel/\"><template><style>:host{display:block;position:relative}#outerContainer{position:absolute;top:0;right:0;bottom:0;left:0}#mainPanel{position:relative}#mainContainer{position:relative;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}#dropShadow{position:absolute;top:0;left:0;right:0;height:6px;box-shadow:inset 0 5px 6px -3px rgba(0,0,0,.4)}#dropShadow.hidden{display:none}:host([mode=scroll]) #mainContainer{overflow:visible}:host([mode=scroll]) #outerContainer{overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}:host([mode=cover]) #mainPanel{position:static}:host([mode=cover]) #mainContainer{position:absolute;top:0;right:0;bottom:0;left:0}:host([mode=cover]) #dropShadow{position:static;width:100%}</style><div id=\"outerContainer\" vertical=\"\" layout=\"\"><content id=\"headerContent\" select=\"core-toolbar, .core-header\"></content><div id=\"mainPanel\" flex=\"\" vertical=\"\" layout=\"\"><div id=\"mainContainer\" flex?=\"{{mode !== 'cover'}}\"><content id=\"mainContent\" select=\"*\"></content></div><div id=\"dropShadow\"></div></div></div></template><script>Polymer(\"core-header-panel\",{publish:{mode:{value:\"\",reflect:true},tallClass:\"tall\",shadow:false},animateDuration:200,modeConfigs:{shadowMode:{waterfall:1,\"waterfall-tall\":1},noShadow:{seamed:1,cover:1,scroll:1},tallMode:{\"waterfall-tall\":1},outerScroll:{scroll:1}},ready:function(){this.scrollHandler=this.scroll.bind(this);this.addListener()},detached:function(){this.removeListener(this.mode)},addListener:function(){this.scroller.addEventListener(\"scroll\",this.scrollHandler)},removeListener:function(mode){var s=this.getScrollerForMode(mode);s.removeEventListener(\"scroll\",this.scrollHandler)},domReady:function(){this.async(\"scroll\")},modeChanged:function(old){var header=this.header;if(header){var configs=this.modeConfigs;if(configs.tallMode[old]&&!configs.tallMode[this.mode]){header.classList.remove(this.tallClass);this.async(function(){header.classList.remove(\"animate\")},null,this.animateDuration)}else{header.classList.toggle(\"animate\",configs.tallMode[this.mode])}}if(configs&&(configs.outerScroll[this.mode]||configs.outerScroll[old])){this.removeListener(old);this.addListener()}this.scroll()},get header(){return this.$.headerContent.getDistributedNodes()[0]},getScrollerForMode:function(mode){return this.modeConfigs.outerScroll[mode]?this.$.outerContainer:this.$.mainContainer},get scroller(){return this.getScrollerForMode(this.mode)},scroll:function(){var configs=this.modeConfigs;var main=this.$.mainContainer;var header=this.header;var sTop=main.scrollTop;var atTop=sTop===0;this.$.dropShadow.classList.toggle(\"hidden\",!this.shadow&&(atTop&&configs.shadowMode[this.mode]||configs.noShadow[this.mode]));if(header&&configs.tallMode[this.mode]){header.classList.toggle(this.tallClass,atTop||header.classList.contains(this.tallClass)&&main.scrollHeight<this.$.outerContainer.offsetHeight)}this.fire(\"scroll\",{target:this.scroller},this,false)}});</script></polymer-element><script>(function(){var block={newline:/^\\n+/,code:/^( {4}[^\\n]+\\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\\n+|$)/,heading:/^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,nptable:noop,lheading:/^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,blockquote:/^( *>[^\\n]+(\\n(?!def)[^\\n]+)*\\n*)+/,list:/^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\\n{2,}|\\s*$)/,def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,table:noop,paragraph:/^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,text:/^[^\\n]+/};block.bullet=/(?:[*+-]|\\d+\\.)/;block.item=/^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/;block.item=replace(block.item,\"gm\")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)(\"hr\",\"\\\\n+(?=\\\\1?(?:[-*_] *){3,}(?:\\\\n+|$))\")(\"def\",\"\\\\n+(?=\"+block.def.source+\")\")();block.blockquote=replace(block.blockquote)(\"def\",block.def)();block._tag=\"(?!(?:\"+\"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code\"+\"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo\"+\"|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|[^\\\\w\\\\s@]*@)\\\\b\";block.html=replace(block.html)(\"comment\",/<!--[\\s\\S]*?-->/)(\"closed\",/<(tag)[\\s\\S]+?<\\/\\1>/)(\"closing\",/<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)(\"hr\",block.hr)(\"heading\",block.heading)(\"lheading\",block.lheading)(\"blockquote\",block.blockquote)(\"tag\",\"<\"+block._tag)(\"def\",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\\S+)? *\\n([\\s\\S]+?)\\s*\\1 *(?:\\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)(\"(?!\",\"(?!\"+block.gfm.fences.source.replace(\"\\\\1\",\"\\\\2\")+\"|\"+block.list.source.replace(\"\\\\1\",\"\\\\3\")+\"|\")();block.tables=merge({},block.gfm,{nptable:/^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,table:/^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\\r\\n|\\r/g,\"\\n\").replace(/\\t/g,\"    \").replace(/\\u00a0/g,\" \").replace(/\\u2424/g,\"\\n\");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,\"\"),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:\"space\"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,\"\");this.tokens.push({type:\"code\",text:!this.options.pedantic?cap.replace(/\\n+$/,\"\"):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"code\",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"heading\",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:\"table\",header:cap[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:cap[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:cap[3].replace(/\\n$/,\"\").split(\"\\n\")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]=\"right\"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]=\"center\"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]=\"left\"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].split(/ *\\| */)}this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"heading\",depth:cap[2]===\"=\"?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"hr\"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"blockquote_start\"});cap=cap[0].replace(/^ *> ?/gm,\"\");this.token(cap,top,true);this.tokens.push({type:\"blockquote_end\"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:\"list_start\",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\\d+\\.) +/,\"\");if(~item.indexOf(\"\\n \")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp(\"^ {1,\"+space+\"}\",\"gm\"),\"\"):item.replace(/^ {1,4}/gm,\"\")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+1).join(\"\\n\")+src;i=l-1}}loose=next||/\\n\\n(?!\\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)===\"\\n\";if(!loose)loose=next}this.tokens.push({type:loose?\"loose_item_start\":\"list_item_start\"});this.token(item,false,bq);this.tokens.push({type:\"list_item_end\"})}this.tokens.push({type:\"list_end\"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?\"paragraph\":\"html\",pre:cap[1]===\"pre\"||cap[1]===\"script\"||cap[1]===\"style\",text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:\"table\",header:cap[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:cap[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:cap[3].replace(/(?: *\\| *)?\\n$/,\"\").split(\"\\n\")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]=\"right\"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]=\"center\"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]=\"left\"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].replace(/^ *\\| *| *\\| *$/g,\"\").split(/ *\\| */)}this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:\"paragraph\",text:cap[1].charAt(cap[1].length-1)===\"\\n\"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"text\",text:cap[0]});continue}if(src){throw new Error(\"Infinite loop on byte: \"+src.charCodeAt(0))}}return this.tokens};var inline={escape:/^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,autolink:/^<([^ >]+(@|:\\/)[^ >]+)>/,url:noop,tag:/^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,link:/^!?\\[(inside)\\]\\(href\\)/,reflink:/^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,nolink:/^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,strong:/^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,em:/^\\b_((?:__|[\\s\\S])+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,code:/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,br:/^ {2,}\\n(?!\\s*$)/,del:noop,text:/^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/};inline._inside=/(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/;inline._href=/\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/;inline.link=replace(inline.link)(\"inside\",inline._inside)(\"href\",inline._href)();inline.reflink=replace(inline.reflink)(\"inside\",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,em:/^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)(\"])\",\"~|])\")(),url:/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,del:/^~~(?=\\S)([\\s\\S]*?\\S)~~/,text:replace(inline.text)(\"]|\",\"~]|\")(\"|\",\"|https?://|\")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)(\"{2,}\",\"*\")(),text:replace(inline.gfm.text)(\"{2,}\",\"*\")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error(\"Tokens array requires a `links` property.\")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out=\"\",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]===\"@\"){text=cap[1].charAt(6)===\":\"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle(\"mailto:\")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^<a /i.test(cap[0])){this.inLink=true}else if(this.inLink&&/^<\\/a>/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\\s+/g,\" \");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(this.smartypants(cap[0]));continue}if(src){throw new Error(\"Infinite loop on byte: \"+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!==\"!\"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,\"—\").replace(/(^|[-\\u2014/(\\[{\"\\s])'/g,\"$1‘\").replace(/'/g,\"’\").replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g,\"$1“\").replace(/\"/g,\"”\").replace(/\\.{3}/g,\"…\")};InlineLexer.prototype.mangle=function(text){var out=\"\",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>.5){ch=\"x\"+ch.toString(16)}out+=\"&#\"+ch+\";\"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return\"<pre><code>\"+(escaped?code:escape(code,true))+\"\\n</code></pre>\"}return'<pre><code class=\"'+this.options.langPrefix+escape(lang,true)+'\">'+(escaped?code:escape(code,true))+\"\\n</code></pre>\\n\"};Renderer.prototype.blockquote=function(quote){return\"<blockquote>\\n\"+quote+\"</blockquote>\\n\"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return\"<h\"+level+' id=\"'+this.options.headerPrefix+raw.toLowerCase().replace(/[^\\w]+/g,\"-\")+'\">'+text+\"</h\"+level+\">\\n\"};Renderer.prototype.hr=function(){return this.options.xhtml?\"<hr/>\\n\":\"<hr>\\n\"};Renderer.prototype.list=function(body,ordered){var type=ordered?\"ol\":\"ul\";return\"<\"+type+\">\\n\"+body+\"</\"+type+\">\\n\"};Renderer.prototype.listitem=function(text){return\"<li>\"+text+\"</li>\\n\"};Renderer.prototype.paragraph=function(text){return\"<p>\"+text+\"</p>\\n\"};Renderer.prototype.table=function(header,body){return\"<table>\\n\"+\"<thead>\\n\"+header+\"</thead>\\n\"+\"<tbody>\\n\"+body+\"</tbody>\\n\"+\"</table>\\n\"};Renderer.prototype.tablerow=function(content){return\"<tr>\\n\"+content+\"</tr>\\n\"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?\"th\":\"td\";var tag=flags.align?\"<\"+type+' style=\"text-align:'+flags.align+'\">':\"<\"+type+\">\";return tag+content+\"</\"+type+\">\\n\"};Renderer.prototype.strong=function(text){return\"<strong>\"+text+\"</strong>\"};Renderer.prototype.em=function(text){return\"<em>\"+text+\"</em>\"};Renderer.prototype.codespan=function(text){return\"<code>\"+text+\"</code>\"};Renderer.prototype.br=function(){return this.options.xhtml?\"<br/>\":\"<br>\"};Renderer.prototype.del=function(text){return\"<del>\"+text+\"</del>\"};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\\w:]/g,\"\").toLowerCase()}catch(e){return\"\"}if(prot.indexOf(\"javascript:\")===0){return\"\"}}var out='<a href=\"'+href+'\"';if(title){out+=' title=\"'+title+'\"'}out+=\">\"+text+\"</a>\";return out};Renderer.prototype.image=function(href,title,text){var out='<img src=\"'+href+'\" alt=\"'+text+'\"';if(title){out+=' title=\"'+title+'\"'}out+=this.options.xhtml?\"/>\":\">\";return out};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out=\"\";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type===\"text\"){body+=\"\\n\"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case\"space\":{return\"\"}case\"hr\":{return this.renderer.hr()}case\"heading\":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case\"code\":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case\"table\":{var header=\"\",body=\"\",i,row,cell,flags,j;cell=\"\";for(i=0;i<this.token.header.length;i++){flags={header:true,align:this.token.align[i]};cell+=this.renderer.tablecell(this.inline.output(this.token.header[i]),{header:true,align:this.token.align[i]})}header+=this.renderer.tablerow(cell);for(i=0;i<this.token.cells.length;i++){row=this.token.cells[i];cell=\"\";for(j=0;j<row.length;j++){cell+=this.renderer.tablecell(this.inline.output(row[j]),{header:false,align:this.token.align[j]})}body+=this.renderer.tablerow(cell)}return this.renderer.table(header,body)}case\"blockquote_start\":{var body=\"\";while(this.next().type!==\"blockquote_end\"){body+=this.tok()}return this.renderer.blockquote(body)}case\"list_start\":{var body=\"\",ordered=this.token.ordered;while(this.next().type!==\"list_end\"){body+=this.tok()}return this.renderer.list(body,ordered)}case\"list_item_start\":{var body=\"\";while(this.next().type!==\"list_item_end\"){body+=this.token.type===\"text\"?this.parseText():this.tok()}return this.renderer.listitem(body)}case\"loose_item_start\":{var body=\"\";while(this.next().type!==\"list_item_end\"){body+=this.tok()}return this.renderer.listitem(body)}case\"html\":{var html=!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;return this.renderer.html(html)}case\"paragraph\":{return this.renderer.paragraph(this.inline.output(this.token.text))}case\"text\":{return this.renderer.paragraph(this.parseText())}}};function escape(html,encode){return html.replace(!encode?/&(?!#?\\w+;)/g:/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}function unescape(html){return html.replace(/&([#\\w]+);/g,function(_,n){n=n.toLowerCase();if(n===\"colon\")return\":\";if(n.charAt(0)===\"#\"){return n.charAt(1)===\"x\"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return\"\"})}function replace(regex,opt){regex=regex.source;opt=opt||\"\";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\\[])\\^/g,\"$1\");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target){if(Object.prototype.hasOwnProperty.call(target,key)){obj[key]=target[key]}}}return obj}function marked(src,opt,callback){if(callback||typeof opt===\"function\"){if(!callback){callback=opt;opt=null}opt=merge({},marked.defaults,opt||{});var highlight=opt.highlight,tokens,pending,i=0;try{tokens=Lexer.lex(src,opt)}catch(e){return callback(e)}pending=tokens.length;var done=function(){var out,err;try{out=Parser.parse(tokens,opt)}catch(e){err=e}opt.highlight=highlight;return err?callback(err):callback(null,out)};if(!highlight||highlight.length<3){return done()}delete opt.highlight;if(!pending)return done();for(;i<tokens.length;i++){(function(token){if(token.type!==\"code\"){return--pending||done()}return highlight(token.text,token.lang,function(err,code){if(code==null||code===token.text){return--pending||done()}token.text=code;token.escaped=true;--pending||done()})})(tokens[i])}return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+=\"\\nPlease report this to https://github.com/chjj/marked.\";if((opt||marked.defaults).silent){return\"<p>An error occured:</p><pre>\"+escape(e.message+\"\",true)+\"</pre>\"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:\"lang-\",smartypants:false,headerPrefix:\"\",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof exports===\"object\"){module.exports=marked}else if(typeof define===\"function\"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!==\"undefined\"?window:global)}());</script><polymer-element name=\"marked-element\" attributes=\"text\" assetpath=\"../marked-element/\"><script>Polymer(\"marked-element\",{text:\"\",attached:function(){marked.setOptions({highlight:this.highlight.bind(this)});if(!this.text){this.text=this.innerHTML}},textChanged:function(oldVal,newVal){if(newVal){this.innerHTML=marked(this.text)}},highlight:function(code,lang){var event=this.fire(\"marked-js-highlight\",{code:code,lang:lang});return event.detail.code||code}});</script></polymer-element><script>var IN_GLOBAL_SCOPE=true;window[\"PR_SHOULD_USE_CONTINUATION\"]=true;var prettyPrintOne;var prettyPrint;(function(){var win=window;var FLOW_CONTROL_KEYWORDS=[\"break,continue,do,else,for,if,return,while\"];var C_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"auto,case,char,const,default,\"+\"double,enum,extern,float,goto,inline,int,long,register,short,signed,\"+\"sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"];var COMMON_KEYWORDS=[C_KEYWORDS,\"catch,class,delete,false,import,\"+\"new,operator,private,protected,public,this,throw,true,try,typeof\"];var CPP_KEYWORDS=[COMMON_KEYWORDS,\"alignof,align_union,asm,axiom,bool,\"+\"concept,concept_map,const_cast,constexpr,decltype,delegate,\"+\"dynamic_cast,explicit,export,friend,generic,late_check,\"+\"mutable,namespace,nullptr,property,reinterpret_cast,static_assert,\"+\"static_cast,template,typeid,typename,using,virtual,where\"];var JAVA_KEYWORDS=[COMMON_KEYWORDS,\"abstract,assert,boolean,byte,extends,final,finally,implements,import,\"+\"instanceof,interface,null,native,package,strictfp,super,synchronized,\"+\"throws,transient\"];var CSHARP_KEYWORDS=[JAVA_KEYWORDS,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,\"+\"fixed,foreach,from,group,implicit,in,internal,into,is,let,\"+\"lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,\"+\"sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,\"+\"var,virtual,where\"];var COFFEE_KEYWORDS=\"all,and,by,catch,class,else,extends,false,finally,\"+\"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,\"+\"throw,true,try,unless,until,when,while,yes\";var JSCRIPT_KEYWORDS=[COMMON_KEYWORDS,\"debugger,eval,export,function,get,null,set,undefined,var,with,\"+\"Infinity,NaN\"];var PERL_KEYWORDS=\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,\"+\"goto,if,import,last,local,my,next,no,our,print,package,redo,require,\"+\"sub,undef,unless,until,use,wantarray,while,BEGIN,END\";var PYTHON_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"and,as,assert,class,def,del,\"+\"elif,except,exec,finally,from,global,import,in,is,lambda,\"+\"nonlocal,not,or,pass,print,raise,try,with,yield,\"+\"False,True,None\"];var RUBY_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"alias,and,begin,case,class,\"+\"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,\"+\"rescue,retry,self,super,then,true,undef,unless,until,when,yield,\"+\"BEGIN,END\"];var RUST_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"as,assert,const,copy,drop,\"+\"enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,\"+\"pub,pure,ref,self,static,struct,true,trait,type,unsafe,use\"];var SH_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"case,done,elif,esac,eval,fi,\"+\"function,in,local,set,then,until\"];var ALL_KEYWORDS=[CPP_KEYWORDS,CSHARP_KEYWORDS,JSCRIPT_KEYWORDS,PERL_KEYWORDS,PYTHON_KEYWORDS,RUBY_KEYWORDS,SH_KEYWORDS];var C_TYPES=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/;var PR_STRING=\"str\";var PR_KEYWORD=\"kwd\";var PR_COMMENT=\"com\";var PR_TYPE=\"typ\";var PR_LITERAL=\"lit\";var PR_PUNCTUATION=\"pun\";var PR_PLAIN=\"pln\";var PR_TAG=\"tag\";var PR_DECLARATION=\"dec\";var PR_SOURCE=\"src\";var PR_ATTRIB_NAME=\"atn\";var PR_ATTRIB_VALUE=\"atv\";var PR_NOCODE=\"nocode\";var REGEXP_PRECEDER_PATTERN=\"(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<<?=?|>>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*\";function combinePrefixPatterns(regexs){var capturedGroupIndex=0;var needToFoldCase=false;var ignoreCase=false;for(var i=0,n=regexs.length;i<n;++i){var regex=regexs[i];if(regex.ignoreCase){ignoreCase=true}else if(/[a-z]/i.test(regex.source.replace(/\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi,\"\"))){needToFoldCase=true;ignoreCase=false;break}}var escapeCharToCodeUnit={b:8,t:9,n:10,v:11,f:12,r:13};function decodeEscape(charsetPart){var cc0=charsetPart.charCodeAt(0);if(cc0!==92){return cc0}var c1=charsetPart.charAt(1);cc0=escapeCharToCodeUnit[c1];if(cc0){return cc0}else if(\"0\"<=c1&&c1<=\"7\"){return parseInt(charsetPart.substring(1),8)}else if(c1===\"u\"||c1===\"x\"){return parseInt(charsetPart.substring(2),16)}else{return charsetPart.charCodeAt(1)}}function encodeEscape(charCode){if(charCode<32){return(charCode<16?\"\\\\x0\":\"\\\\x\")+charCode.toString(16)}var ch=String.fromCharCode(charCode);return ch===\"\\\\\"||ch===\"-\"||ch===\"]\"||ch===\"^\"?\"\\\\\"+ch:ch}function caseFoldCharset(charSet){var charsetParts=charSet.substring(1,charSet.length-1).match(new RegExp(\"\\\\\\\\u[0-9A-Fa-f]{4}\"+\"|\\\\\\\\x[0-9A-Fa-f]{2}\"+\"|\\\\\\\\[0-3][0-7]{0,2}\"+\"|\\\\\\\\[0-7]{1,2}\"+\"|\\\\\\\\[\\\\s\\\\S]\"+\"|-\"+\"|[^-\\\\\\\\]\",\"g\"));var ranges=[];var inverse=charsetParts[0]===\"^\";var out=[\"[\"];if(inverse){out.push(\"^\")}for(var i=inverse?1:0,n=charsetParts.length;i<n;++i){var p=charsetParts[i];if(/\\\\[bdsw]/i.test(p)){out.push(p)}else{var start=decodeEscape(p);var end;if(i+2<n&&\"-\"===charsetParts[i+1]){end=decodeEscape(charsetParts[i+2]);i+=2}else{end=start}ranges.push([start,end]);if(!(end<65||start>122)){if(!(end<65||start>90)){ranges.push([Math.max(65,start)|32,Math.min(end,90)|32])}if(!(end<97||start>122)){ranges.push([Math.max(97,start)&~32,Math.min(end,122)&~32])}}}}ranges.sort(function(a,b){return a[0]-b[0]||b[1]-a[1]});var consolidatedRanges=[];var lastRange=[];for(var i=0;i<ranges.length;++i){var range=ranges[i];if(range[0]<=lastRange[1]+1){lastRange[1]=Math.max(lastRange[1],range[1])}else{consolidatedRanges.push(lastRange=range)}}for(var i=0;i<consolidatedRanges.length;++i){var range=consolidatedRanges[i];out.push(encodeEscape(range[0]));if(range[1]>range[0]){if(range[1]+1>range[0]){out.push(\"-\")}out.push(encodeEscape(range[1]))}}out.push(\"]\");return out.join(\"\")}function allowAnywhereFoldCaseAndRenumberGroups(regex){var parts=regex.source.match(new RegExp(\"(?:\"+\"\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]\"+\"|\\\\\\\\u[A-Fa-f0-9]{4}\"+\"|\\\\\\\\x[A-Fa-f0-9]{2}\"+\"|\\\\\\\\[0-9]+\"+\"|\\\\\\\\[^ux0-9]\"+\"|\\\\(\\\\?[:!=]\"+\"|[\\\\(\\\\)\\\\^]\"+\"|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+\"+\")\",\"g\"));var n=parts.length;var capturedGroups=[];for(var i=0,groupIndex=0;i<n;++i){var p=parts[i];if(p===\"(\"){++groupIndex}else if(\"\\\\\"===p.charAt(0)){var decimalValue=+p.substring(1);if(decimalValue){if(decimalValue<=groupIndex){capturedGroups[decimalValue]=-1}else{parts[i]=encodeEscape(decimalValue)}}}}for(var i=1;i<capturedGroups.length;++i){if(-1===capturedGroups[i]){capturedGroups[i]=++capturedGroupIndex}}for(var i=0,groupIndex=0;i<n;++i){var p=parts[i];if(p===\"(\"){++groupIndex;if(!capturedGroups[groupIndex]){parts[i]=\"(?:\"}}else if(\"\\\\\"===p.charAt(0)){var decimalValue=+p.substring(1);if(decimalValue&&decimalValue<=groupIndex){parts[i]=\"\\\\\"+capturedGroups[decimalValue]}}}for(var i=0;i<n;++i){if(\"^\"===parts[i]&&\"^\"!==parts[i+1]){parts[i]=\"\"}}if(regex.ignoreCase&&needToFoldCase){for(var i=0;i<n;++i){var p=parts[i];var ch0=p.charAt(0);if(p.length>=2&&ch0===\"[\"){parts[i]=caseFoldCharset(p)}else if(ch0!==\"\\\\\"){parts[i]=p.replace(/[a-zA-Z]/g,function(ch){var cc=ch.charCodeAt(0);return\"[\"+String.fromCharCode(cc&~32,cc|32)+\"]\"})}}}return parts.join(\"\")}var rewritten=[];for(var i=0,n=regexs.length;i<n;++i){var regex=regexs[i];if(regex.global||regex.multiline){throw new Error(\"\"+regex)}rewritten.push(\"(?:\"+allowAnywhereFoldCaseAndRenumberGroups(regex)+\")\")}return new RegExp(rewritten.join(\"|\"),ignoreCase?\"gi\":\"g\")}function extractSourceSpans(node,isPreformatted){var nocode=/(?:^|\\s)nocode(?:\\s|$)/;var chunks=[];var length=0;var spans=[];var k=0;function walk(node){var type=node.nodeType;if(type==1){if(nocode.test(node.className)){return}for(var child=node.firstChild;child;child=child.nextSibling){walk(child)}var nodeName=node.nodeName.toLowerCase();if(\"br\"===nodeName||\"li\"===nodeName){chunks[k]=\"\\n\";spans[k<<1]=length++;spans[k++<<1|1]=node}}else if(type==3||type==4){var text=node.nodeValue;if(text.length){if(!isPreformatted){text=text.replace(/[ \\t\\r\\n]+/g,\" \")}else{text=text.replace(/\\r\\n?/g,\"\\n\")}chunks[k]=text;spans[k<<1]=length;length+=text.length;spans[k++<<1|1]=node}}}walk(node);return{sourceCode:chunks.join(\"\").replace(/\\n$/,\"\"),spans:spans}}function appendDecorations(basePos,sourceCode,langHandler,out){if(!sourceCode){return}var job={sourceCode:sourceCode,basePos:basePos};langHandler(job);out.push.apply(out,job.decorations)}var notWs=/\\S/;function childContentWrapper(element){var wrapper=undefined;for(var c=element.firstChild;c;c=c.nextSibling){var type=c.nodeType;wrapper=type===1?wrapper?element:c:type===3?notWs.test(c.nodeValue)?element:wrapper:wrapper}return wrapper===element?undefined:wrapper}function createSimpleLexer(shortcutStylePatterns,fallthroughStylePatterns){var shortcuts={};var tokenizer;(function(){var allPatterns=shortcutStylePatterns.concat(fallthroughStylePatterns);var allRegexs=[];var regexKeys={};for(var i=0,n=allPatterns.length;i<n;++i){var patternParts=allPatterns[i];var shortcutChars=patternParts[3];if(shortcutChars){for(var c=shortcutChars.length;--c>=0;){shortcuts[shortcutChars.charAt(c)]=patternParts}}var regex=patternParts[1];var k=\"\"+regex;if(!regexKeys.hasOwnProperty(k)){allRegexs.push(regex);regexKeys[k]=null}}allRegexs.push(/[\\0-\\uffff]/);tokenizer=combinePrefixPatterns(allRegexs)})();var nPatterns=fallthroughStylePatterns.length;var decorate=function(job){var sourceCode=job.sourceCode,basePos=job.basePos;var decorations=[basePos,PR_PLAIN];var pos=0;var tokens=sourceCode.match(tokenizer)||[];var styleCache={};for(var ti=0,nTokens=tokens.length;ti<nTokens;++ti){var token=tokens[ti];var style=styleCache[token];var match=void 0;var isEmbedded;if(typeof style===\"string\"){isEmbedded=false}else{var patternParts=shortcuts[token.charAt(0)];if(patternParts){match=token.match(patternParts[1]);style=patternParts[0]}else{for(var i=0;i<nPatterns;++i){patternParts=fallthroughStylePatterns[i];match=token.match(patternParts[1]);if(match){style=patternParts[0];break}}if(!match){style=PR_PLAIN}}isEmbedded=style.length>=5&&\"lang-\"===style.substring(0,5);if(isEmbedded&&!(match&&typeof match[1]===\"string\")){isEmbedded=false;style=PR_SOURCE}if(!isEmbedded){styleCache[token]=style}}var tokenStart=pos;pos+=token.length;if(!isEmbedded){decorations.push(basePos+tokenStart,style)}else{var embeddedSource=match[1];var embeddedSourceStart=token.indexOf(embeddedSource);var embeddedSourceEnd=embeddedSourceStart+embeddedSource.length;if(match[2]){embeddedSourceEnd=token.length-match[2].length;embeddedSourceStart=embeddedSourceEnd-embeddedSource.length}var lang=style.substring(5);appendDecorations(basePos+tokenStart,token.substring(0,embeddedSourceStart),decorate,decorations);appendDecorations(basePos+tokenStart+embeddedSourceStart,embeddedSource,langHandlerForExtension(lang,embeddedSource),decorations);appendDecorations(basePos+tokenStart+embeddedSourceEnd,token.substring(embeddedSourceEnd),decorate,decorations)}}job.decorations=decorations};return decorate}function sourceDecorator(options){var shortcutStylePatterns=[],fallthroughStylePatterns=[];if(options[\"tripleQuotedStrings\"]){shortcutStylePatterns.push([PR_STRING,/^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,null,\"'\\\"\"])}else if(options[\"multiLineStrings\"]){shortcutStylePatterns.push([PR_STRING,/^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,null,\"'\\\"`\"])}else{shortcutStylePatterns.push([PR_STRING,/^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,null,\"\\\"'\"])}if(options[\"verbatimStrings\"]){fallthroughStylePatterns.push([PR_STRING,/^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/,null])}var hc=options[\"hashComments\"];if(hc){if(options[\"cStyleComments\"]){if(hc>1){shortcutStylePatterns.push([PR_COMMENT,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,\"#\"])}else{shortcutStylePatterns.push([PR_COMMENT,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,null,\"#\"])}fallthroughStylePatterns.push([PR_STRING,/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,null])}else{shortcutStylePatterns.push([PR_COMMENT,/^#[^\\r\\n]*/,null,\"#\"])}}if(options[\"cStyleComments\"]){fallthroughStylePatterns.push([PR_COMMENT,/^\\/\\/[^\\r\\n]*/,null]);fallthroughStylePatterns.push([PR_COMMENT,/^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,null])}var regexLiterals=options[\"regexLiterals\"];if(regexLiterals){var regexExcls=regexLiterals>1?\"\":\"\\n\\r\";var regexAny=regexExcls?\".\":\"[\\\\S\\\\s]\";var REGEX_LITERAL=\"/(?=[^/*\"+regexExcls+\"])\"+\"(?:[^/\\\\x5B\\\\x5C\"+regexExcls+\"]\"+\"|\\\\x5C\"+regexAny+\"|\\\\x5B(?:[^\\\\x5C\\\\x5D\"+regexExcls+\"]\"+\"|\\\\x5C\"+regexAny+\")*(?:\\\\x5D|$))+\"+\"/\";fallthroughStylePatterns.push([\"lang-regex\",RegExp(\"^\"+REGEXP_PRECEDER_PATTERN+\"(\"+REGEX_LITERAL+\")\")])}var types=options[\"types\"];if(types){fallthroughStylePatterns.push([PR_TYPE,types])}var keywords=(\"\"+options[\"keywords\"]).replace(/^ | $/g,\"\");if(keywords.length){fallthroughStylePatterns.push([PR_KEYWORD,new RegExp(\"^(?:\"+keywords.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),null])}shortcutStylePatterns.push([PR_PLAIN,/^\\s+/,null,\" \\r\\n\t \"]);var punctuation=\"^.[^\\\\s\\\\w.$@'\\\"`/\\\\\\\\]*\";if(options[\"regexLiterals\"]){punctuation+=\"(?!s*/)\"}fallthroughStylePatterns.push([PR_LITERAL,/^@[a-z_$][a-z_$@0-9]*/i,null],[PR_TYPE,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/,null],[PR_PLAIN,/^[a-z_$][a-z_$@0-9]*/i,null],[PR_LITERAL,new RegExp(\"^(?:\"+\"0x[a-f0-9]+\"+\"|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)\"+\"(?:e[+\\\\-]?\\\\d+)?\"+\")\"+\"[a-z]*\",\"i\"),null,\"0123456789\"],[PR_PLAIN,/^\\\\[\\s\\S]?/,null],[PR_PUNCTUATION,new RegExp(punctuation),null]);return createSimpleLexer(shortcutStylePatterns,fallthroughStylePatterns)}var decorateSource=sourceDecorator({keywords:ALL_KEYWORDS,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function numberLines(node,opt_startLineNum,isPreformatted){var nocode=/(?:^|\\s)nocode(?:\\s|$)/;var lineBreak=/\\r\\n?|\\n/;var document=node.ownerDocument;var li=document.createElement(\"li\");while(node.firstChild){li.appendChild(node.firstChild)}var listItems=[li];function walk(node){var type=node.nodeType;if(type==1&&!nocode.test(node.className)){if(\"br\"===node.nodeName){breakAfter(node);if(node.parentNode){node.parentNode.removeChild(node)}}else{for(var child=node.firstChild;child;child=child.nextSibling){walk(child)}}}else if((type==3||type==4)&&isPreformatted){var text=node.nodeValue;var match=text.match(lineBreak);if(match){var firstLine=text.substring(0,match.index);node.nodeValue=firstLine;var tail=text.substring(match.index+match[0].length);if(tail){var parent=node.parentNode;parent.insertBefore(document.createTextNode(tail),node.nextSibling)}breakAfter(node);if(!firstLine){node.parentNode.removeChild(node)}}}}function breakAfter(lineEndNode){while(!lineEndNode.nextSibling){lineEndNode=lineEndNode.parentNode;if(!lineEndNode){return}}function breakLeftOf(limit,copy){var rightSide=copy?limit.cloneNode(false):limit;var parent=limit.parentNode;if(parent){var parentClone=breakLeftOf(parent,1);var next=limit.nextSibling;parentClone.appendChild(rightSide);for(var sibling=next;sibling;sibling=next){next=sibling.nextSibling;parentClone.appendChild(sibling)}}return rightSide}var copiedListItem=breakLeftOf(lineEndNode.nextSibling,0);for(var parent;(parent=copiedListItem.parentNode)&&parent.nodeType===1;){copiedListItem=parent}listItems.push(copiedListItem)}for(var i=0;i<listItems.length;++i){walk(listItems[i])}if(opt_startLineNum===(opt_startLineNum|0)){listItems[0].setAttribute(\"value\",opt_startLineNum)}var ol=document.createElement(\"ol\");ol.className=\"linenums\";var offset=Math.max(0,opt_startLineNum-1|0)||0;for(var i=0,n=listItems.length;i<n;++i){li=listItems[i];li.className=\"L\"+(i+offset)%10;if(!li.firstChild){li.appendChild(document.createTextNode(\" \"))}ol.appendChild(li)}node.appendChild(ol)}function recombineTagsAndDecorations(job){var isIE8OrEarlier=/\\bMSIE\\s(\\d+)/.exec(navigator.userAgent);isIE8OrEarlier=isIE8OrEarlier&&+isIE8OrEarlier[1]<=8;var newlineRe=/\\n/g;var source=job.sourceCode;var sourceLength=source.length;var sourceIndex=0;var spans=job.spans;var nSpans=spans.length;var spanIndex=0;var decorations=job.decorations;var nDecorations=decorations.length;var decorationIndex=0;decorations[nDecorations]=sourceLength;var decPos,i;for(i=decPos=0;i<nDecorations;){if(decorations[i]!==decorations[i+2]){decorations[decPos++]=decorations[i++];decorations[decPos++]=decorations[i++]}else{i+=2}}nDecorations=decPos;for(i=decPos=0;i<nDecorations;){var startPos=decorations[i];var startDec=decorations[i+1];var end=i+2;while(end+2<=nDecorations&&decorations[end+1]===startDec){end+=2}decorations[decPos++]=startPos;decorations[decPos++]=startDec;i=end}nDecorations=decorations.length=decPos;var sourceNode=job.sourceNode;var oldDisplay;if(sourceNode){oldDisplay=sourceNode.style.display;sourceNode.style.display=\"none\"}try{var decoration=null;while(spanIndex<nSpans){var spanStart=spans[spanIndex];var spanEnd=spans[spanIndex+2]||sourceLength;var decEnd=decorations[decorationIndex+2]||sourceLength;var end=Math.min(spanEnd,decEnd);var textNode=spans[spanIndex+1];var styledText;if(textNode.nodeType!==1&&(styledText=source.substring(sourceIndex,end))){if(isIE8OrEarlier){styledText=styledText.replace(newlineRe,\"\\r\")}textNode.nodeValue=styledText;var document=textNode.ownerDocument;var span=document.createElement(\"span\");span.className=decorations[decorationIndex+1];var parentNode=textNode.parentNode;parentNode.replaceChild(span,textNode);span.appendChild(textNode);if(sourceIndex<spanEnd){spans[spanIndex+1]=textNode=document.createTextNode(source.substring(end,spanEnd));parentNode.insertBefore(textNode,span.nextSibling)}}sourceIndex=end;if(sourceIndex>=spanEnd){spanIndex+=2}if(sourceIndex>=decEnd){decorationIndex+=2}}}finally{if(sourceNode){sourceNode.style.display=oldDisplay}}}var langHandlerRegistry={};function registerLangHandler(handler,fileExtensions){for(var i=fileExtensions.length;--i>=0;){var ext=fileExtensions[i];if(!langHandlerRegistry.hasOwnProperty(ext)){langHandlerRegistry[ext]=handler}else if(win[\"console\"]){console[\"warn\"](\"cannot override language handler %s\",ext)}}}function langHandlerForExtension(extension,source){if(!(extension&&langHandlerRegistry.hasOwnProperty(extension))){extension=/^\\s*</.test(source)?\"default-markup\":\"default-code\"}return langHandlerRegistry[extension]}registerLangHandler(decorateSource,[\"default-code\"]);registerLangHandler(createSimpleLexer([],[[PR_PLAIN,/^[^<?]+/],[PR_DECLARATION,/^<!\\w[^>]*(?:>|$)/],[PR_COMMENT,/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);registerLangHandler(createSimpleLexer([[PR_PLAIN,/^[\\s]+/,null,\" \t\\r\\n\"],[PR_ATTRIB_VALUE,/^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/,null,\"\\\"'\"]],[[PR_TAG,/^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],[PR_ATTRIB_NAME,/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],[PR_PUNCTUATION,/^[=<>\\/]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],[\"lang-css\",/^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-css\",/^style\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-css\",/^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]]),[\"in.tag\"]);registerLangHandler(createSimpleLexer([],[[PR_ATTRIB_VALUE,/^[\\s\\S]+/]]),[\"uq.val\"]);registerLangHandler(sourceDecorator({keywords:CPP_KEYWORDS,hashComments:true,cStyleComments:true,types:C_TYPES}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);registerLangHandler(sourceDecorator({keywords:\"null,true,false\"}),[\"json\"]);registerLangHandler(sourceDecorator({keywords:CSHARP_KEYWORDS,hashComments:true,cStyleComments:true,verbatimStrings:true,types:C_TYPES}),[\"cs\"]);registerLangHandler(sourceDecorator({keywords:JAVA_KEYWORDS,cStyleComments:true}),[\"java\"]);registerLangHandler(sourceDecorator({keywords:SH_KEYWORDS,hashComments:true,multiLineStrings:true}),[\"bash\",\"bsh\",\"csh\",\"sh\"]);registerLangHandler(sourceDecorator({keywords:PYTHON_KEYWORDS,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),[\"cv\",\"py\",\"python\"]);registerLangHandler(sourceDecorator({keywords:PERL_KEYWORDS,hashComments:true,multiLineStrings:true,regexLiterals:2}),[\"perl\",\"pl\",\"pm\"]);registerLangHandler(sourceDecorator({keywords:RUBY_KEYWORDS,hashComments:true,multiLineStrings:true,regexLiterals:true}),[\"rb\",\"ruby\"]);registerLangHandler(sourceDecorator({keywords:JSCRIPT_KEYWORDS,cStyleComments:true,regexLiterals:true}),[\"javascript\",\"js\"]);registerLangHandler(sourceDecorator({keywords:COFFEE_KEYWORDS,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),[\"coffee\"]);registerLangHandler(sourceDecorator({keywords:RUST_KEYWORDS,cStyleComments:true,multilineStrings:true}),[\"rc\",\"rs\",\"rust\"]);registerLangHandler(createSimpleLexer([],[[PR_STRING,/^[\\s\\S]+/]]),[\"regex\"]);function applyDecorator(job){var opt_langExtension=job.langExtension;try{var sourceAndSpans=extractSourceSpans(job.sourceNode,job.pre);var source=sourceAndSpans.sourceCode;job.sourceCode=source;job.spans=sourceAndSpans.spans;job.basePos=0;langHandlerForExtension(opt_langExtension,source)(job);recombineTagsAndDecorations(job)}catch(e){if(win[\"console\"]){console[\"log\"](e&&e[\"stack\"]||e)}}}function $prettyPrintOne(sourceCodeHtml,opt_langExtension,opt_numberLines){var container=document.createElement(\"div\");container.innerHTML=\"<pre>\"+sourceCodeHtml+\"</pre>\";container=container.firstChild;if(opt_numberLines){numberLines(container,opt_numberLines,true)}var job={langExtension:opt_langExtension,numberLines:opt_numberLines,sourceNode:container,pre:1};applyDecorator(job);return container.innerHTML}function $prettyPrint(opt_whenDone,opt_root){var root=opt_root||document.body;var doc=root.ownerDocument||document;function byTagName(tn){return root.getElementsByTagName(tn)}var codeSegments=[byTagName(\"pre\"),byTagName(\"code\"),byTagName(\"xmp\")];var elements=[];for(var i=0;i<codeSegments.length;++i){for(var j=0,n=codeSegments[i].length;j<n;++j){elements.push(codeSegments[i][j])}}codeSegments=null;var clock=Date;if(!clock[\"now\"]){clock={now:function(){return+new Date}}}var k=0;var prettyPrintingJob;var langExtensionRe=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;var prettyPrintRe=/\\bprettyprint\\b/;var prettyPrintedRe=/\\bprettyprinted\\b/;var preformattedTagNameRe=/pre|xmp/i;var codeRe=/^code$/i;var preCodeXmpRe=/^(?:pre|code|xmp)$/i;var EMPTY={};function doWork(){var endTime=win[\"PR_SHOULD_USE_CONTINUATION\"]?clock[\"now\"]()+250:Infinity;for(;k<elements.length&&clock[\"now\"]()<endTime;k++){var cs=elements[k];var attrs=EMPTY;{for(var preceder=cs;preceder=preceder.previousSibling;){var nt=preceder.nodeType;var value=(nt===7||nt===8)&&preceder.nodeValue;if(value?!/^\\??prettify\\b/.test(value):nt!==3||/\\S/.test(preceder.nodeValue)){break}if(value){attrs={};value.replace(/\\b(\\w+)=([\\w:.%+-]+)/g,function(_,name,value){attrs[name]=value});break}}}var className=cs.className;if((attrs!==EMPTY||prettyPrintRe.test(className))&&!prettyPrintedRe.test(className)){var nested=false;for(var p=cs.parentNode;p;p=p.parentNode){var tn=p.tagName;if(preCodeXmpRe.test(tn)&&p.className&&prettyPrintRe.test(p.className)){nested=true;break}}if(!nested){cs.className+=\" prettyprinted\";var langExtension=attrs[\"lang\"];if(!langExtension){langExtension=className.match(langExtensionRe);var wrapper;if(!langExtension&&(wrapper=childContentWrapper(cs))&&codeRe.test(wrapper.tagName)){langExtension=wrapper.className.match(langExtensionRe)}if(langExtension){langExtension=langExtension[1]}}var preformatted;if(preformattedTagNameRe.test(cs.tagName)){preformatted=1}else{var currentStyle=cs[\"currentStyle\"];var defaultView=doc.defaultView;var whitespace=currentStyle?currentStyle[\"whiteSpace\"]:defaultView&&defaultView.getComputedStyle?defaultView.getComputedStyle(cs,null).getPropertyValue(\"white-space\"):0;preformatted=whitespace&&\"pre\"===whitespace.substring(0,3)}var lineNums=attrs[\"linenums\"];if(!(lineNums=lineNums===\"true\"||+lineNums)){lineNums=className.match(/\\blinenums\\b(?::(\\d+))?/);lineNums=lineNums?lineNums[1]&&lineNums[1].length?+lineNums[1]:true:false}if(lineNums){numberLines(cs,lineNums,preformatted)}prettyPrintingJob={langExtension:langExtension,sourceNode:cs,numberLines:lineNums,pre:preformatted};applyDecorator(prettyPrintingJob)}}}if(k<elements.length){setTimeout(doWork,250)}else if(\"function\"===typeof opt_whenDone){opt_whenDone()}}doWork()}var PR=win[\"PR\"]={createSimpleLexer:createSimpleLexer,registerLangHandler:registerLangHandler,sourceDecorator:sourceDecorator,PR_ATTRIB_NAME:PR_ATTRIB_NAME,PR_ATTRIB_VALUE:PR_ATTRIB_VALUE,PR_COMMENT:PR_COMMENT,PR_DECLARATION:PR_DECLARATION,PR_KEYWORD:PR_KEYWORD,PR_LITERAL:PR_LITERAL,PR_NOCODE:PR_NOCODE,PR_PLAIN:PR_PLAIN,PR_PUNCTUATION:PR_PUNCTUATION,PR_SOURCE:PR_SOURCE,PR_STRING:PR_STRING,PR_TAG:PR_TAG,PR_TYPE:PR_TYPE,prettyPrintOne:IN_GLOBAL_SCOPE?win[\"prettyPrintOne\"]=$prettyPrintOne:prettyPrintOne=$prettyPrintOne,prettyPrint:prettyPrint=IN_GLOBAL_SCOPE?win[\"prettyPrint\"]=$prettyPrint:prettyPrint=$prettyPrint};if(typeof define===\"function\"&&define[\"amd\"]){define(\"google-code-prettify\",[],function(){return PR})}})();</script><script>(function(scope){var ContextFreeParser={parse:function(text){var top={};var entities=[];var current=top;var subCurrent={};var scriptDocCommentClause=\"\\\\/\\\\*\\\\*([\\\\s\\\\S]*?)\\\\*\\\\/\";var htmlDocCommentClause=\"<!--([\\\\s\\\\S]*?)-->\";var docCommentRegex=new RegExp(scriptDocCommentClause+\"|\"+htmlDocCommentClause,\"g\");var docComments=text.match(docCommentRegex)||[];docComments.forEach(function(m){var lines=m.replace(/\\r\\n/g,\"\\n\").replace(/^\\s*\\/\\*\\*|^\\s*\\*\\/|^\\s*\\* ?|^\\s*\\<\\!-\\-|^s*\\-\\-\\>/gm,\"\").split(\"\\n\");var pragmas=[];lines=lines.filter(function(l){var m=l.match(/\\s*@([\\w-]*) (.*)/);if(!m){return true}pragmas.push(m)});var code=lines.join(\"\\n\");pragmas.forEach(function(m){var pragma=m[1],content=m[2];switch(pragma){case\"class\":case\"element\":current={name:content,description:code};entities.push(current);break;case\"attribute\":case\"property\":case\"method\":case\"event\":subCurrent={name:content,description:code};var label=pragma==\"property\"?\"properties\":pragma+\"s\";makePragma(current,label,subCurrent);break;case\"default\":case\"type\":subCurrent[pragma]=content;break;case\"param\":var eventParmsRe=/\\{(.+)\\}\\s+(\\w+[.\\w+]+)\\s+(.*)$/;var params=content.match(eventParmsRe);if(params){var subEventObj={type:params[1],name:params[2],description:params[3]};makePragma(subCurrent,pragma+\"s\",subEventObj)}break;default:current[pragma]=content;break}});function makePragma(object,pragma,content){var p$=object;var p=p$[pragma];if(!p){p$[pragma]=p=[]}p.push(content)}});if(entities.length===0){entities.push({name:\"Entity\",description:\"**Undocumented**\"})}return entities}};if(typeof module!==\"undefined\"&&module.exports){module.exports=ContextFreeParser}else{scope.ContextFreeParser=ContextFreeParser}})(this);</script><polymer-element name=\"core-xhr\" hidden assetpath=\"../core-ajax/\"><script>Polymer(\"core-xhr\",{request:function(options){var xhr=new XMLHttpRequest;var url=options.url;var method=options.method||\"GET\";var async=!options.sync;var params=this.toQueryString(options.params);if(params&&method==\"GET\"){url+=(url.indexOf(\"?\")>0?\"&\":\"?\")+params}var xhrParams=this.isBodyMethod(method)?options.body||params:null;xhr.open(method,url,async);if(options.responseType){xhr.responseType=options.responseType}if(options.withCredentials){xhr.withCredentials=true}this.makeReadyStateHandler(xhr,options.callback);this.setRequestHeaders(xhr,options.headers);xhr.send(xhrParams);if(!async){xhr.onreadystatechange(xhr)}return xhr},toQueryString:function(params){var r=[];for(var n in params){var v=params[n];n=encodeURIComponent(n);r.push(v==null?n:n+\"=\"+encodeURIComponent(v))}return r.join(\"&\")},isBodyMethod:function(method){return this.bodyMethods[(method||\"\").toUpperCase()]},bodyMethods:{POST:1,PUT:1,DELETE:1},makeReadyStateHandler:function(xhr,callback){xhr.onreadystatechange=function(){if(xhr.readyState==4){callback&&callback.call(null,xhr.response,xhr)}}},setRequestHeaders:function(xhr,headers){if(headers){for(var name in headers){xhr.setRequestHeader(name,headers[name])}}}});</script></polymer-element><polymer-element name=\"core-ajax\" hidden attributes=\"url handleAs auto params response error method headers body contentType withCredentials\" assetpath=\"../core-ajax/\"><script>Polymer(\"core-ajax\",{url:\"\",handleAs:\"\",auto:false,params:\"\",response:null,error:null,method:\"\",headers:null,body:null,contentType:\"application/x-www-form-urlencoded\",withCredentials:false,xhrArgs:null,ready:function(){this.xhr=document.createElement(\"core-xhr\")},receive:function(response,xhr){if(this.isSuccess(xhr)){this.processResponse(xhr)}else{this.processError(xhr)}this.complete(xhr)},isSuccess:function(xhr){var status=xhr.status||0;return!status||status>=200&&status<300},processResponse:function(xhr){var response=this.evalResponse(xhr);if(xhr===this.activeRequest){this.response=response}this.fire(\"core-response\",{response:response,xhr:xhr})},processError:function(xhr){var response=xhr.status+\": \"+xhr.responseText;if(xhr===this.activeRequest){this.error=response}this.fire(\"core-error\",{response:response,xhr:xhr})},complete:function(xhr){this.fire(\"core-complete\",{response:xhr.status,xhr:xhr})},evalResponse:function(xhr){return this[(this.handleAs||\"text\")+\"Handler\"](xhr)},xmlHandler:function(xhr){return xhr.responseXML},textHandler:function(xhr){return xhr.responseText},jsonHandler:function(xhr){var r=xhr.responseText;try{return JSON.parse(r)}catch(x){console.warn(\"core-ajax caught an exception trying to parse response as JSON:\");console.warn(\"url:\",this.url);console.warn(x);return r}},documentHandler:function(xhr){return xhr.response},blobHandler:function(xhr){return xhr.response},arraybufferHandler:function(xhr){return xhr.response},urlChanged:function(){if(!this.handleAs){var ext=String(this.url).split(\".\").pop();switch(ext){case\"json\":this.handleAs=\"json\";break}}this.autoGo()},paramsChanged:function(){this.autoGo()},autoChanged:function(){this.autoGo()},autoGo:function(){if(this.auto){this.goJob=this.job(this.goJob,this.go,0)}},go:function(){var args=this.xhrArgs||{};args.body=this.body||args.body;args.params=this.params||args.params;if(args.params&&typeof args.params==\"string\"){args.params=JSON.parse(args.params)}args.headers=this.headers||args.headers||{};if(args.headers&&typeof args.headers==\"string\"){args.headers=JSON.parse(args.headers)}var hasContentType=Object.keys(args.headers).some(function(header){return header.toLowerCase()===\"content-type\"});if(!hasContentType&&this.contentType){args.headers[\"Content-Type\"]=this.contentType}if(this.handleAs===\"arraybuffer\"||this.handleAs===\"blob\"||this.handleAs===\"document\"){args.responseType=this.handleAs}args.withCredentials=this.withCredentials;args.callback=this.receive.bind(this);args.url=this.url;args.method=this.method;this.response=this.error=null;this.activeRequest=args.url&&this.xhr.request(args);return this.activeRequest}});</script></polymer-element><polymer-element name=\"context-free-parser\" attributes=\"url text data\" assetpath=\"../context-free-parser/\"><template><core-ajax url=\"{{url}}\" response=\"{{text}}\" auto=\"\"></core-ajax></template><script>Polymer(\"context-free-parser\",{text:null,textChanged:function(){if(this.text){var entities=ContextFreeParser.parse(this.text);if(!entities||entities.length===0){entities=[{name:this.url.split(\"/\").pop(),description:\"**Undocumented**\"}]}this.data={classes:entities}}},dataChanged:function(){this.fire(\"data-ready\")}});</script></polymer-element><polymer-element name=\"core-doc-page\" attributes=\"data\" relative=\"\" assetpath=\"../core-doc-viewer/elements/\"><template><style>:host{display:block}#info>*{margin-right:20px}core-icon{margin-right:5px}.main{padding:0 72px;max-width:832px;margin:0 auto}marked-element{display:block}h1{color:#E91E63;font-size:52px;line-height:60px;font-weight:inherit}.box{margin-bottom:40px}.box:not(.top) .details{padding:16px}.box:not(.top) .details .params{margin-top:40px}.box:not(.top) h3{padding:16px;color:#fff;font-weight:inherit;font-size:20px;line-height:48px;margin:0}.box:not(.top) pre{padding:initial;background-color:transparent;margin:initial;font-size:12px}.box code{color:currentcolor;font-weight:500}.top pre{background-color:#fafafa;padding:16px}pre{max-width:832px;white-space:pre-wrap;overflow:hidden;border:none}.attribute-box .details{background-color:#ffcbbb;border-bottom:1px solid rgba(255,86,33,.5)}.attribute-box h3{background-color:#ff5621}.property-box .details{background-color:#fbe7b1;border-bottom:1px solid rgba(243,179,0,.5)}.property-box h3{background-color:#f3b300}.method-box .details{background-color:#a6ffea;border-bottom:1px solid rgba(0,190,164,.5)}.method-box h3{background-color:#00bea4}.event-box .details{background-color:#c5d9fb;border-bottom:1px solid rgba(65,132,243,.5)}.event-box h3{background-color:#4184f3}.badge{color:currentcolor}code,pre{color:#9f499b;font-family:\"Source Code Pro\",Monaco,Menlo,Consolas,\"Courier New\",monospace}pre .typ,pre .inline,.prettyprint .typ,.prettyprint .inline{color:#6b499f}pre .pun,.prettyprint .pun{color:#5c6bc0}pre .str,pre .string,.prettyprint .str,.prettyprint .string{color:#ff4081}pre .pln,.prettyprint .pln{color:#7986cb}pre .kwd,.prettyprint .kwd{color:#d61a7f}pre .atn,pre .attribute-name,.prettyprint .atn,.prettyprint .attribute-name{color:#6b499f}pre .atv,pre .attribute-value,.prettyprint .atv,.prettyprint .attribute-value{color:#7986cb}pre .com,pre .comment,.prettyprint .com,.prettyprint .comment{color:#8a8a8a}</style><core-header-panel id=\"panel\" mode=\"waterfall\" fit=\"\"><div class=\"main\" on-marked-js-highlight=\"{{hilight}}\"><h1>{{data.name}}</h1><p id=\"info\" layout=\"\" horizontal=\"\" center=\"\"><span layout=\"\" horizontal=\"\" center=\"\"><core-icon icon=\"home\"></core-icon><a href=\"{{data | homepageFilter}}\">Home Page</a></span><span layout=\"\" horizontal=\"\" center=\"\" hidden?=\"{{!data.version}}\"><core-icon icon=\"info-outline\"></core-icon>Version: {{data.version}}</span></p><template if=\"{{data.extends}}\"><section class=\"top\"><h3 id=\"{{data.name}}.extends\">Extends: <a href=\"#{{data.extends}}\">{{data.extends}}</a></h3></section></template><template if=\"{{data.description}}\"><section class=\"box top\"><h3 id=\"{{data.name}}.summary\">Summary</h3><marked-element text=\"{{data.description}}\"></marked-element></section></template><template if=\"{{data.attributes.length}}\"><section class=\"box attribute-box\"><h3 id=\"{{data.name}}.attributes\">Attributes</h3><template repeat=\"{{attribute in data.attributes}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.attributes.{{attribute.name}}\"><p><code>{{attribute.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><p layout=\"\" horizontal=\"\" center=\"\" justified=\"\"><code>&lt;<em>{{attribute.type}}</em>&gt;</code><span class=\"default\" hidden?=\"{{!attribute.default}}\">default: <code>{{attribute.default}}</code></span></p><marked-element text=\"{{attribute.description}}\"></marked-element></div></div></template></section></template><template if=\"{{data.properties.length}}\"><section class=\"box property-box\"><h3 id=\"{{data.name}}.properties\">Properties</h3><template repeat=\"{{property in data.properties}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.properties.{{property.name}}\"><p><code>{{property.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><p layout=\"\" horizontal=\"\" center=\"\" justified=\"\"><code>&lt;<em>{{property.type}}</em>&gt;</code><span class=\"default\" hidden?=\"{{!property.default}}\">default: <code>{{property.default}}</code></span></p><marked-element text=\"{{property.description}}\"></marked-element></div></div></template></section></template><template if=\"{{data.events.length}}\"><section class=\"box event-box\"><h3 id=\"{{data.name}}.events\">Events</h3><template repeat=\"{{event in data.events}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.events.{{event.name}}\"><p><code>{{event.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><marked-element text=\"{{event.description}}\"></marked-element><template if=\"{{event.params.length}}\"><div class=\"params\"><p>Event details:</p><template repeat=\"{{param in event.params}}\"><p><code>&lt;<em>{{param.type}}</em>&gt; {{param.name}}</code></p><p><span>{{param.description}}</span></p></template></div></template></div></div></template></section></template><template if=\"{{data.methods.length}}\"><section class=\"box method-box\"><h3 id=\"{{data.name}}.methods\">Methods</h3><template repeat=\"{{method in data.methods}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.methods.{{method.name}}\"><p><code>{{method.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><marked-element text=\"{{method.description}}\"></marked-element><template if=\"{{method.params.length}}\"><div class=\"params\"><p>Method parameters:</p><template repeat=\"{{param in method.params}}\"><p><code>&lt;<em>{{param.type}}</em>&gt; {{param.name}}</code></p><p><span>{{param.description}}</span></p></template></div></template></div></div></template></section></template></div></core-header-panel></template><script>Polymer(\"core-doc-page\",{hilight:function(event,detail,sender){detail.code=prettyPrintOne((detail.code||\"\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"))},homepageFilter:function(data){if(!data){return\"\"}if(!data.homepage||data.homepage===\"github.io\"){return\"//polymer.github.io/\"+data.name}else{return data.homepage}},dataChanged:function(){this.async(function(){var elementToFocus=this.shadowRoot.getElementById(window.location.hash.slice(1));if(elementToFocus){elementToFocus.scrollIntoView()}})}});</script></polymer-element><polymer-element name=\"core-selection\" attributes=\"multi\" hidden assetpath=\"../core-selection/\"><script>Polymer(\"core-selection\",{multi:false,ready:function(){this.clear()},clear:function(){this.selection=[]},getSelection:function(){return this.multi?this.selection:this.selection[0]},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!==undefined&&item!==null){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}this.fire(\"core-select\",{isSelected:isSelected,item:item})}},select:function(item){if(this.multi){this.toggle(item)}else if(this.getSelection()!==item){this.setItemSelected(this.getSelection(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}});</script></polymer-element><polymer-element name=\"core-selector\" attributes=\"selected multi valueattr selectedClass selectedProperty selectedAttribute selectedItem selectedModel selectedIndex notap excludedLocalNames target itemsSelector activateEvent\" assetpath=\"../core-selector/\"><template><core-selection id=\"selection\" multi=\"{{multi}}\" on-core-select=\"{{selectionSelect}}\"></core-selection><content id=\"items\" select=\"*\"></content></template><script>Polymer(\"core-selector\",{selected:null,multi:false,valueattr:\"name\",selectedClass:\"core-selected\",selectedProperty:\"\",selectedAttribute:\"active\",selectedItem:null,selectedModel:null,selectedIndex:-1,excludedLocalNames:\"\",target:null,itemsSelector:\"\",activateEvent:\"tap\",notap:false,defaultExcludedLocalNames:\"template\",observe:{\"selected multi\":\"selectedChanged\"},ready:function(){this.activateListener=this.activateHandler.bind(this);this.itemFilter=this.filterItem.bind(this);this.excludedLocalNamesChanged();this.observer=new MutationObserver(this.updateSelected.bind(this));if(!this.target){this.target=this}},get items(){if(!this.target){return[]}var nodes=this.target!==this?this.itemsSelector?this.target.querySelectorAll(this.itemsSelector):this.target.children:this.$.items.getDistributedNodes();return Array.prototype.filter.call(nodes,this.itemFilter)},filterItem:function(node){return!this._excludedNames[node.localName]},excludedLocalNamesChanged:function(){this._excludedNames={};var s=this.defaultExcludedLocalNames;if(this.excludedLocalNames){s+=\" \"+this.excludedLocalNames}s.split(/\\s+/g).forEach(function(n){this._excludedNames[n]=1},this)},targetChanged:function(old){if(old){this.removeListener(old);this.observer.disconnect();this.clearSelection()}if(this.target){this.addListener(this.target);this.observer.observe(this.target,{childList:true});this.updateSelected()}},addListener:function(node){Polymer.addEventListener(node,this.activateEvent,this.activateListener)},removeListener:function(node){Polymer.removeEventListener(node,this.activateEvent,this.activateListener)},get selection(){return this.$.selection.getSelection()},selectedChanged:function(){if(arguments.length===1){this.processSplices(arguments[0])}else{this.updateSelected()}},updateSelected:function(){this.validateSelected();if(this.multi){this.clearSelection(this.selected);this.selected&&this.selected.forEach(function(s){this.setValueSelected(s,true)},this)}else{this.valueToSelection(this.selected)}},validateSelected:function(){if(this.multi&&!Array.isArray(this.selected)&&this.selected!=null){this.selected=[this.selected]}else if(!this.multi&&Array.isArray(this.selected)){var s=this.selected[0];this.clearSelection([s]);this.selected=s}},processSplices:function(splices){for(var i=0,splice;splice=splices[i];i++){for(var j=0;j<splice.removed.length;j++){this.setValueSelected(splice.removed[j],false)}for(var j=0;j<splice.addedCount;j++){this.setValueSelected(this.selected[splice.index+j],true)}}},clearSelection:function(excludes){this.$.selection.selection.slice().forEach(function(item){var v=this.valueForNode(item)||this.items.indexOf(item);if(!excludes||excludes.indexOf(v)<0){this.$.selection.setItemSelected(item,false)}},this)},valueToSelection:function(value){var item=this.valueToItem(value);this.$.selection.select(item)},setValueSelected:function(value,isSelected){var item=this.valueToItem(value);if(isSelected^this.$.selection.isSelected(item)){this.$.selection.setItemSelected(item,isSelected)}},updateSelectedItem:function(){this.selectedItem=this.selection},selectedItemChanged:function(){if(this.selectedItem){var t=this.selectedItem.templateInstance;this.selectedModel=t?t.model:undefined}else{this.selectedModel=null}this.selectedIndex=this.selectedItem?parseInt(this.valueToIndex(this.selected)):-1},valueToItem:function(value){return value===null||value===undefined?null:this.items[this.valueToIndex(value)]},valueToIndex:function(value){for(var i=0,items=this.items,c;c=items[i];i++){if(this.valueForNode(c)==value){return i}}return value},valueForNode:function(node){return node[this.valueattr]||node.getAttribute(this.valueattr)},selectionSelect:function(e,detail){this.updateSelectedItem();if(detail.item){this.applySelection(detail.item,detail.isSelected)}},applySelection:function(item,isSelected){if(this.selectedClass){item.classList.toggle(this.selectedClass,isSelected)}if(this.selectedProperty){item[this.selectedProperty]=isSelected}if(this.selectedAttribute&&item.setAttribute){if(isSelected){item.setAttribute(this.selectedAttribute,\"\")}else{item.removeAttribute(this.selectedAttribute)}}},activateHandler:function(e){if(!this.notap){var i=this.findDistributedTarget(e.target,this.items);if(i>=0){var item=this.items[i];var s=this.valueForNode(item)||i;if(this.multi){if(this.selected){this.addRemoveSelected(s)}else{this.selected=[s]}}else{this.selected=s}this.asyncFire(\"core-activate\",{item:item})}}},addRemoveSelected:function(value){var i=this.selected.indexOf(value);if(i>=0){this.selected.splice(i,1)}else{this.selected.push(value)}},findDistributedTarget:function(target,nodes){while(target&&target!=this){var i=Array.prototype.indexOf.call(nodes,target);if(i>=0){return i}target=target.parentNode}},selectIndex:function(index){var item=this.items[index];if(item){this.selected=this.valueForNode(item)||index;return item}},selectPrevious:function(wrapped){var i=wrapped&&!this.selectedIndex?this.items.length-1:this.selectedIndex-1;return this.selectIndex(i)},selectNext:function(wrapped){var i=wrapped&&this.selectedIndex>=this.items.length-1?0:this.selectedIndex+1;return this.selectIndex(i)}});</script></polymer-element><polymer-element name=\"core-menu\" extends=\"core-selector\" assetpath=\"../core-menu/\"><template><style>:host{display:block;margin:12px}polyfill-next-selector{content:':host > core-item'}::content>core-item{cursor:default}</style><shadow></shadow></template><script>Polymer(\"core-menu\");</script></polymer-element><polymer-element name=\"core-item\" attributes=\"label icon src\" horizontal=\"\" center=\"\" layout=\"\" assetpath=\"../core-item/\"><template><style>:host{display:block;position:relative;min-height:40px;white-space:nowrap}:host(.font-scalable){min-height:2.5em}:host(.core-selected){font-weight:700}#icon{margin:0 16px 0 4px}:host(.font-scalable) #icon{margin:0 1em 0 .25em;height:1.5em;width:1.5em}polyfill-next-selector{content:':host > a'}::content>a{position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.000001)}</style><template if=\"{{icon || src}}\"><core-icon src=\"{{src}}\" id=\"icon\" icon=\"{{icon}}\" hidden?=\"{{!src && !icon}}\"></core-icon></template><div id=\"label\">{{label}}</div><content></content></template><script>Polymer(\"core-item\",{});</script></polymer-element><polymer-element name=\"core-doc-toc\" attributes=\"data selected\" assetpath=\"../core-doc-viewer/elements/\"><template><style>:host{display:block;position:relative;border-right:1px solid silver}core-header-panel{position:absolute;top:0;left:0;height:100%;width:100%}core-toolbar{background-color:#eee}</style><core-header-panel mode=\"waterfall\"><core-menu selected=\"{{selected}}\"><template repeat=\"{{data}}\"><core-item><a href=\"#{{name}}\">{{name}}</a></core-item></template></core-menu></core-header-panel></template><script>Polymer(\"core-doc-toc\",{searchAction:function(){this.$.searchBar.style.opacity=1;this.$.searchBar.style.display=\"\"},closeSearchAction:function(){this.$.searchBar.style.opacity=0;this.$.searchBar.style.display=\"none\"}});</script></polymer-element><polymer-element name=\"core-doc-viewer\" attributes=\"sources route url\" horizontal=\"\" layout=\"\" assetpath=\"../core-doc-viewer/\"><template><style>core-doc-toc{display:none;width:332px;overflow-x:hidden}</style><context-free-parser url=\"{{url}}\" on-data-ready=\"{{parserDataReady}}\"></context-free-parser><template repeat=\"{{sources}}\"><context-free-parser url=\"{{}}\" on-data-ready=\"{{parserDataReady}}\"></context-free-parser></template><core-doc-toc id=\"toc\" data=\"{{classes}}\" selected=\"{{selected}}\"></core-doc-toc><core-doc-page flex=\"\" data=\"{{data}}\"></core-doc-page></template><script>Polymer(\"core-doc-viewer\",{classes:[],sources:[],ready:function(){window.addEventListener(\"hashchange\",this.parseLocationHash.bind(this));this.parseLocationHash()},parseLocationHash:function(){this.route=window.location.hash.slice(1)},routeChanged:function(){this.validateRoute()},validateRoute:function(){if(this.route){this.classes.some(function(c){if(c.name===this.route.split(\".\")[0]){this.data=c;this.route=\"\";return}},this)}},selectedChanged:function(){this.data=this.classes[this.selected]},parserDataReady:function(event,detail,sender){var path=\"\";if(this.sources.length){var path=event.target.templateInstance.model;var idx=path.lastIndexOf(\"/\");path=idx!=-1?path.substr(0,idx):\".\"}else{var parts=location.pathname.split(\"/\");parts.pop();path=parts.join(\"/\")}var data=event.target.data;var xhr=new XMLHttpRequest;xhr.open(\"GET\",path+\"/bower.json\");xhr.onerror=function(e){this.assimilateData(data)}.bind(this);xhr.onloadend=function(e){if(e.target.status==200){var version=JSON.parse(e.target.response).version;for(var i=0,c;c=data.classes[i];++i){c.version=version}}this.assimilateData(data)}.bind(this);xhr.send()},assimilateData:function(data){this.classes=this.classes.concat(data.classes);this.classes.sort(function(a,b){var na=a&&a.name.toLowerCase(),nb=b&&b.name.toLowerCase();return na<nb?-1:na==nb?0:1});if(!this.data&&!this.route&&this.classes.length){this.data=this.classes[0]}if(this.classes.length>1){this.$.toc.style.display=\"block\"}this.validateRoute()}});</script></polymer-element></div>\n<div hidden>undefined</div>\n\n<!--\n\nImplements the default landing page for Polymer components.\n\n`<core-component-page>` can render an information page for any component.\nPolymer components use this component in `index.html` to provide the standard landing page.\n\n`<core-component-page>` is _vulcanized_, which means it contains all it's dependencies baked in.\nTherefore, this component is intended to be used only by itself in a page.\n\nThis *-dev package contains the raw source and the dependency manifest necessary\nto reconstruct `core-component-page/core-component-page.html` via vulcanize. To vulcanize,\ncheck out the core-component-page repo alongside this repo and run build.sh. This will\ndrop the vulcanize output into `core-component-page/core-component-page.html`.\n\nNote: `<core-component-page>` sets the page title automatically.\n\n@group Polymer Core Elements\n@element core-component-page\n\n-->\n\n<polymer-element name=\"core-component-page\" attributes=\"moduleName sources\" layout=\"\" vertical=\"\" assetpath=\"../core-component-page-dev/\"><template><style>:host{font-family:Arial,sans-serif;height:100vh}h2{display:inline-block;margin:8px 6px;vertical-align:middle}.choiceB,.choiceC,.choiceD{color:#fff;font-size:12px;font-weight:700;text-decoration:none;background-color:#4285F4;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);box-shadow:0 0 1px 0 rgba(0,0,0,.1);border-radius:2px;cursor:pointer;display:inline-block;padding:4px 12px 5px 12px;margin:4px 0}.appbar{background-color:#E91E63;color:#fff}</style><core-toolbar class=\"appbar\"><span>{{moduleName}}</span><a class=\"choiceC\" target=\"_blank\" href=\"../{{moduleName}}/demo.html\">demo</a></core-toolbar><core-doc-viewer flex=\"\" url=\"{{url}}\" sources=\"{{sources}}\"></core-doc-viewer></template><script>Polymer(\"core-component-page\",{moduleName:\"\",sources:[],ready:function(){this.moduleName=this.moduleName||this.findModuleName()},moduleNameChanged:function(){document.title=this.moduleName;this.url=!this.sources.length&&this.moduleName?this.moduleName+\".html\":\"\"},findModuleName:function(){var path=location.pathname.split(\"/\");var name=path.pop()||path.pop();if(name.indexOf(\".html\")>=0){name=path.pop()}return name||\"\"}});</script></polymer-element>\n"
  },
  {
    "path": "build/mui/bower_components/core-component-page/demo.html",
    "content": "<!doctype html>\r\n<!--\r\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\r\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\r\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\r\nCode distributed by Google as part of the polymer project is also\r\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\r\n-->\r\n<html>\r\n<head>\r\n\r\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\r\n  <link rel=\"import\" href=\"../polymer/polymer.html\">\r\n  <link rel=\"import\" href=\"core-component-page.html\">\r\n\r\n</head>\r\n<body unresolved>\r\n\r\n  <core-component-page></core-component-page>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "build/mui/bower_components/core-component-page/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-icon/README.md",
    "content": "core-icon\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-icon) for more information.\n"
  },
  {
    "path": "build/mui/bower_components/core-icon/bower.json",
    "content": "{\n  \"name\": \"core-icon\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-iconset\": \"Polymer/core-iconset#^0.5.0\",\n    \"core-icons\": \"Polymer/core-icons#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "build/mui/bower_components/core-icon/core-icon.css",
    "content": "/* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */\n\nhtml /deep/ core-icon {\n  display: inline-block;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n  fill: currentcolor;\n  position: relative;\n  height: 24px;\n  width: 24px;\n}"
  },
  {
    "path": "build/mui/bower_components/core-icon/core-icon.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<!--\n\nThe `core-icon` element displays an icon. By default an icon renders as a 24px square.\n\nExample using src:\n\n    <core-icon src=\"star.png\"></core-icon>\n\nExample setting size to 32px x 32px:\n\n    <core-icon class=\"big\" src=\"big_star.png\"></core-icon>\n\n    <style>\n      .big {\n        height: 32px;\n        width: 32px;\n      }\n    </style>\n\nThe core elements include several sets of icons. \nTo use the default set of icons, import  `core-icons.html` and use the `icon` attribute to specify an icon:\n\n    &lt;!-- import default iconset and core-icon --&gt;\n    <link rel=\"import\" href=\"/components/core-icons/core-icons.html\">\n\n    <core-icon icon=\"menu\"></core-icon>\n    \nTo use a different built-in set of icons, import  `core-icons/<iconset>-icons.html`, and\nspecify the icon as `<iconset>:<icon>`. For example:\n\n    &lt;!-- import communication iconset and core-icon --&gt;\n    <link rel=\"import\" href=\"/components/core-icons/communication-icons.html\">\n\n    <core-icon icon=\"communication:email\"></core-icon>\n    \nYou can also create custom icon sets of bitmap or SVG icons. \n\nExample of using an icon named `cherry` from a custom iconset with the ID `fruit`:\n\n    <core-icon icon=\"fruit:cherry\"></core-icon>\n\nSee [core-iconset](#core-iconset) and [core-iconset-svg](#core-iconset-svg) for more information about\nhow to create a custom iconset.\n\nSee [core-icons](http://www.polymer-project.org/components/core-icons/demo.html) for the default set of icons.\n\n@group Polymer Core Elements\n@element core-icon\n@homepage polymer.github.io\n-->\n<link rel=\"import\" href=\"../core-iconset/core-iconset.html\">\n\n<link rel=\"stylesheet\" href=\"core-icon.css\" shim-shadowdom>\n\n<polymer-element name=\"core-icon\" attributes=\"src icon alt\">\n<script>\n(function() {\n  \n  // mono-state\n  var meta;\n  \n  Polymer('core-icon', {\n\n    /**\n     * The URL of an image for the icon. If the src property is specified,\n     * the icon property should not be.\n     *\n     * @attribute src\n     * @type string\n     * @default ''\n     */\n    src: '',\n\n    /**\n     * Specifies the icon name or index in the set of icons available in\n     * the icon's icon set. If the icon property is specified,\n     * the src property should not be.\n     *\n     * @attribute icon\n     * @type string\n     * @default ''\n     */\n    icon: '',\n\n    /**\n     * Alternative text content for accessibility support.\n     * If alt is present and not empty, it will set the element's role to img and add an aria-label whose content matches alt.\n     * If alt is present and is an empty string, '', it will hide the element from the accessibility layer\n     * If alt is not present, it will set the element's role to img and the element will fallback to using the icon attribute for its aria-label.\n     * \n     * @attribute alt\n     * @type string\n     * @default ''\n     */\n    alt: null,\n\n    observe: {\n      'icon': 'updateIcon',\n      'alt': 'updateAlt'\n    },\n\n    defaultIconset: 'icons',\n\n    ready: function() {\n      if (!meta) {\n        meta = document.createElement('core-iconset');\n      }\n\n      // Allow user-provided `aria-label` in preference to any other text alternative.\n      if (this.hasAttribute('aria-label')) {\n        // Set `role` if it has not been overridden.\n        if (!this.hasAttribute('role')) {\n          this.setAttribute('role', 'img');\n        }\n        return;\n      }\n      this.updateAlt();\n    },\n\n    srcChanged: function() {\n      var icon = this._icon || document.createElement('div');\n      icon.textContent = '';\n      icon.setAttribute('fit', '');\n      icon.style.backgroundImage = 'url(' + this.src + ')';\n      icon.style.backgroundPosition = 'center';\n      icon.style.backgroundSize = '100%';\n      if (!icon.parentNode) {\n        this.appendChild(icon);\n      }\n      this._icon = icon;\n    },\n\n    getIconset: function(name) {\n      return meta.byId(name || this.defaultIconset);\n    },\n\n    updateIcon: function(oldVal, newVal) {\n      if (!this.icon) {\n        this.updateAlt();\n        return;\n      }\n      var parts = String(this.icon).split(':');\n      var icon = parts.pop();\n      if (icon) {\n        var set = this.getIconset(parts.pop());\n        if (set) {\n          this._icon = set.applyIcon(this, icon);\n          if (this._icon) {\n            this._icon.setAttribute('fit', '');\n          }\n        }\n      }\n      // Check to see if we're using the old icon's name for our a11y fallback\n      if (oldVal) {\n        if (oldVal.split(':').pop() == this.getAttribute('aria-label')) {\n          this.updateAlt();\n        }\n      }\n    },\n\n    updateAlt: function() {\n      // Respect the user's decision to remove this element from\n      // the a11y tree\n      if (this.getAttribute('aria-hidden')) {\n        return;\n      }\n\n      // Remove element from a11y tree if `alt` is empty, otherwise\n      // use `alt` as `aria-label`.\n      if (this.alt === '') {\n        this.setAttribute('aria-hidden', 'true');\n        if (this.hasAttribute('role')) {\n          this.removeAttribute('role');\n        }\n        if (this.hasAttribute('aria-label')) {\n          this.removeAttribute('aria-label');\n        }\n      } else {\n        this.setAttribute('aria-label', this.alt ||\n                                        this.icon.split(':').pop());\n        if (!this.hasAttribute('role')) {\n          this.setAttribute('role', 'img');\n        }\n        if (this.hasAttribute('aria-hidden')) {\n          this.removeAttribute('aria-hidden');\n        }\n      }\n    }\n\n  });\n  \n})();\n</script>\n\n</polymer-element>\n"
  },
  {
    "path": "build/mui/bower_components/core-icon/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<html>\n<head>\n  <title>core-icon</title>\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-icons/core-icons.html\">\n  <link rel=\"import\" href=\"core-icon.html\">\n  \n  <style>\n    segment {\n      min-width: 200px;\n    }\n\n    core-icon.big {\n      height: 128px;\n      width: 128px;\n    }\n  </style>\n</head>\n<body unresolved>\n\n<template is=\"auto-binding\">\n  <div wrap horizontal layout>\n    <template repeat=\"{{icon in $.meta.metaData.icons.iconNames}}\">\n      <segment><core-icon icon=\"{{icon}}\"></core-icon> {{icon}}</segment>\n    </template>\n  </div>\n  <core-iconset id=\"meta\"></core-iconset>\n  <div hidden?=\"{{!$.meta.metaData.icons.iconNames}}\">\n    Sized icon:\n    <core-icon class=\"big\" icon=\"accessibility\"></core-icon>\n  </div>\n</template>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-icon/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-icon/metadata.html",
    "content": "<!--\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-->\n<x-meta id=\"core-icon\" label=\"Icon\" group=\"Core\" hideSubtree>\n\n  <template>\n    <core-icon icon=\"search\"></core-icon>\n  </template>\n\n  <template id=\"imports\">\n    <link rel=\"import\" href=\"../core-icons/core-icons.html\">\n    <link rel=\"import\" href=\"core-icon.html\">\n  </template>\n\n</x-meta>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/README.md",
    "content": "core-icons\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-icons) for more information.\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/av-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"av\" iconSize=\"24\">\n<svg><defs>\n<g id=\"album\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14.5c-2.49 0-4.5-2.01-4.5-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-5.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z\"/></g>\n<g id=\"artist\"><path d=\"M11 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm7.5-2v5.22c-.31-.14-.64-.22-1-.22-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5 2.5-1.12 2.5-2.5V12h2v-2h-3.5zM11 14c-2.67 0-8 1.34-8 4v2h10.76c-.48-.72-.76-1.58-.76-2.5 0-1.18.46-2.26 1.21-3.06-1.17-.29-2.33-.44-3.21-.44z\"/></g>\n<g id=\"av-timer\"><path d=\"M11 17c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1zm0-14v4h2V5.08c3.39.49 6 3.39 6 6.92 0 3.87-3.13 7-7 7s-7-3.13-7-7c0-1.68.59-3.22 1.58-4.42L12 13l1.41-1.41-6.8-6.8v.02C4.42 6.45 3 9.05 3 12c0 4.97 4.02 9 9 9 4.97 0 9-4.03 9-9s-4.03-9-9-9h-1zm7 9c0-.55-.45-1-1-1s-1 .45-1 1 .45 1 1 1 1-.45 1-1zM6 12c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1z\"/></g>\n<g id=\"closed-caption\"><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\"/></g>\n<g id=\"equalizer\"><path d=\"M10 20h4V4h-4v16zm-6 0h4v-8H4v8zM16 9v11h4V9h-4z\"/></g>\n<g id=\"explicit\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h4v2h-4v2h4v2H9V7h6v2z\"/></g>\n<g id=\"fast-forward\"><path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\"/></g>\n<g id=\"fast-rewind\"><path d=\"M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z\"/></g>\n<g id=\"games\"><path d=\"M15 7.5V2H9v5.5l3 3 3-3zM7.5 9H2v6h5.5l3-3-3-3zM9 16.5V22h6v-5.5l-3-3-3 3zM16.5 9l-3 3 3 3H22V9h-5.5z\"/></g>\n<g id=\"genres\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4 6h-3v7c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3c.55 0 1.06.16 1.5.42V6H16v2z\"/></g>\n<g id=\"hearing\"><path d=\"M17 20c-.29 0-.56-.06-.76-.15-.71-.37-1.21-.88-1.71-2.38-.51-1.56-1.47-2.29-2.39-3-.79-.61-1.61-1.24-2.32-2.53C9.29 10.98 9 9.93 9 9c0-2.8 2.2-5 5-5s5 2.2 5 5h2c0-3.93-3.07-7-7-7S7 5.07 7 9c0 1.26.38 2.65 1.07 3.9.91 1.65 1.98 2.48 2.85 3.15.81.62 1.39 1.07 1.71 2.05.6 1.82 1.37 2.84 2.73 3.55.51.23 1.07.35 1.64.35 2.21 0 4-1.79 4-4h-2c0 1.1-.9 2-2 2zM7.64 2.64L6.22 1.22C4.23 3.21 3 5.96 3 9s1.23 5.79 3.22 7.78l1.41-1.41C6.01 13.74 5 11.49 5 9s1.01-4.74 2.64-6.36zM11.5 9c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5-1.12-2.5-2.5-2.5-2.5 1.12-2.5 2.5z\"/></g>\n<g id=\"high-quality\"><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 11H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm7-1c0 .55-.45 1-1 1h-.75v1.5h-1.5V15H14c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v4zm-3.5-.5h2v-3h-2v3z\"/></g>\n<g id=\"ifl\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM8 9.5c-.83 0-1.5-.67-1.5-1.5S7.17 6.5 8 6.5s1.5.67 1.5 1.5S8.83 9.5 8 9.5zm4 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"instant-mix\"><path d=\"M7 4H5v5h2V4zm12 0h-2v9h2V4zM3 13h2v7h2v-7h2v-2H3v2zm12-6h-2V4h-2v3H9v2h6V7zm-4 13h2v-9h-2v9zm4-5v2h2v3h2v-3h2v-2h-6z\"/></g>\n<g id=\"ios\"><path d=\"M4 9h2V7H4v2zm0 8h2v-6H4v6zm7-10H9c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h2c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H9V9h2v6zm9-6V7h-4c-1.1 0-2 .9-2 2v2c0 1.1.9 2 2 2h2v2h-4v2h4c1.1 0 2-.9 2-2v-2c0-1.1-.9-2-2-2h-2V9h4z\"/></g>\n<g id=\"loop\"><path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\"/></g>\n<g id=\"mic\"><path d=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"/></g>\n<g id=\"mic-none\"><path d=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1.2-9.1c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2l-.01 6.2c0 .66-.53 1.2-1.19 1.2-.66 0-1.2-.54-1.2-1.2V4.9zm6.5 6.1c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"/></g>\n<g id=\"mic-off\"><path d=\"M19 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28zm-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18l5.98 5.99zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 .22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c.91-.13 1.77-.45 2.54-.9L19.73 21 21 19.73 4.27 3z\"/></g>\n<g id=\"movie\"><path d=\"M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4z\"/></g>\n<g id=\"movie-info\"><path d=\"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5 19H3v-2h2v2zm0-4H3v-2h2v2zm0-4H3V9h2v2zm0-4H3V5h2v2zm8 10h-2v-6h2v6zm0-8h-2V7h2v2zm8 10h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V9h2v2zm0-4h-2V5h2v2z\"/></g>\n<g id=\"my-library-add\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z\"/></g>\n<g id=\"my-library-books\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9H9V9h10v2zm-4 4H9v-2h6v2zm4-8H9V5h10v2z\"/></g>\n<g id=\"my-library-music\"><path d=\"M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 5h-3v5.5c0 1.38-1.12 2.5-2.5 2.5S10 13.88 10 12.5s1.12-2.5 2.5-2.5c.57 0 1.08.19 1.5.51V5h4v2zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6z\"/></g>\n<g id=\"new-releases\"><path d=\"M23 12l-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68L23 12zm-10 5h-2v-2h2v2zm0-4h-2V7h2v6z\"/></g>\n<g id=\"news\"><path d=\"M20.33 4.67L18.67 3 17 4.67 15.33 3l-1.67 1.67L12 3l-1.67 1.67L8.67 3 7 4.67 5.33 3 3.67 4.67 2 3v16c0 1.1.9 2 2 2h16c1.1 0 1.99-.9 1.99-2L22 3l-1.67 1.67zM12 19H4v-7h8v7zm8 0h-7v-1h7v1zm0-2h-7v-1h7v1zm0-2h-7v-1h7v1zm0-2h-7v-1h7v1zm0-2H4V8h16v3z\"/></g>\n<g id=\"not-interested\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9L16.9 18.31C15.55 19.37 13.85 20 12 20zm6.31-3.1L7.1 5.69C8.45 4.63 10.15 4 12 4c4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z\"/></g>\n<g id=\"pause\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></g>\n<g id=\"pause-circle-fill\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 14H9V8h2v8zm4 0h-2V8h2v8z\"/></g>\n<g id=\"pause-circle-outline\"><path d=\"M9 16h2V8H9v8zm3-14C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm1-4h2V8h-2v8z\"/></g>\n<g id=\"play-arrow\"><path d=\"M8 5v14l11-7z\"/></g>\n<g id=\"play-circle-fill\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 14.5v-9l6 4.5-6 4.5z\"/></g>\n<g id=\"play-circle-outline\"><path d=\"M10 16.5l6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"playlist-add\"><path d=\"M14 10H2v2h12v-2zm0-4H2v2h12V6zm4 8v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2 16h8v-2H2v2z\"/></g>\n<g id=\"play-shopping-bag\"><path d=\"M16 6V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H2v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6h-6zm-6-2h4v2h-4V4zM9 18V9l7.5 4L9 18z\"/></g>\n<g id=\"queue\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z\"/></g>\n<g id=\"queue-music\"><path d=\"M15 6H3v2h12V6zm0 4H3v2h12v-2zM3 16h8v-2H3v2zM17 6v8.18c-.31-.11-.65-.18-1-.18-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3V8h3V6h-5z\"/></g>\n<g id=\"radio\"><path d=\"M3.24 6.15C2.51 6.43 2 7.17 2 8v12c0 1.1.89 2 2 2h16c1.11 0 2-.9 2-2V8c0-1.11-.89-2-2-2H8.3l8.26-3.34L15.88 1 3.24 6.15zM7 20c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm13-8h-2v-2h-2v2H4V8h16v4z\"/></g>\n<g id=\"recent-actors\"><path d=\"M21 5v14h2V5h-2zm-4 14h2V5h-2v14zM14 5H2c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zM8 7.75c1.24 0 2.25 1.01 2.25 2.25S9.24 12.25 8 12.25 5.75 11.24 5.75 10 6.76 7.75 8 7.75zM12.5 17h-9v-.75c0-1.5 3-2.25 4.5-2.25s4.5.75 4.5 2.25V17z\"/></g>\n<g id=\"repeat\"><path d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z\"/></g>\n<g id=\"repeat-one\"><path d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4zm-4-2V9h-1l-2 1v1h1.5v4H13z\"/></g>\n<g id=\"replay\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/></g>\n<g id=\"shuffle\"><path d=\"M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z\"/></g>\n<g id=\"skip-next\"><path d=\"M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z\"/></g>\n<g id=\"skip-previous\"><path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/></g>\n<g id=\"snooze\"><path d=\"M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-3-9h3.63L9 15.2V17h6v-2h-3.63L15 10.8V9H9v2z\"/></g>\n<g id=\"stop\"><path d=\"M6 6h12v12H6z\"/></g>\n<g id=\"subtitles\"><path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z\"/></g>\n<g id=\"surround-sound\"><path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM7.76 16.24l-1.41 1.41C4.78 16.1 4 14.05 4 12c0-2.05.78-4.1 2.34-5.66l1.41 1.41C6.59 8.93 6 10.46 6 12s.59 3.07 1.76 4.24zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm5.66 1.66l-1.41-1.41C17.41 15.07 18 13.54 18 12s-.59-3.07-1.76-4.24l1.41-1.41C19.22 7.9 20 9.95 20 12c0 2.05-.78 4.1-2.34 5.66zM12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"videocam\"><path d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\"/></g>\n<g id=\"videocam-off\"><path d=\"M21 6.5l-4 4V7c0-.55-.45-1-1-1H9.82L21 17.18V6.5zM3.27 2L2 3.27 4.73 6H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.21 0 .39-.08.54-.18L19.73 21 21 19.73 3.27 2z\"/></g>\n<g id=\"video-collection\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8 12.5v-9l6 4.5-6 4.5z\"/></g>\n<g id=\"volume-down\"><path d=\"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z\"/></g>\n<g id=\"volume-mute\"><path d=\"M7 9v6h4l5 5V4l-5 5H7z\"/></g>\n<g id=\"volume-off\"><path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"/></g>\n<g id=\"volume-up\"><path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/></g>\n<g id=\"web\"><path d=\"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 14H4v-4h11v4zm0-5H4V9h11v4zm5 5h-4V9h4v9z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/bower.json",
    "content": "{\n  \"name\": \"core-icons\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-icon\": \"Polymer/core-icon#^0.5.0\",\n    \"core-iconset-svg\": \"Polymer/core-iconset-svg#^0.5.0\",\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "build/mui/bower_components/core-icons/communication-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"communication\" iconSize=\"24\">\n<svg><defs>\n<g id=\"business\"><path d=\"M12 7v-4h-10v18h20v-14h-10zm-6 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm4 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2v-2h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\"/></g>\n<g id=\"call\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1v3.49c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/></g>\n<g id=\"call-end\"><path d=\"M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29l-2.48-2.48c-.18-.17-.29-.42-.29-.7 0-.28.11-.53.29-.71 3.05-2.89 7.17-4.67 11.71-4.67s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28-.79-.74-1.69-1.36-2.67-1.85-.33-.16-.56-.5-.56-.9v-3.1c-1.44-.48-2.99-.73-4.59-.73z\"/></g>\n<g id=\"call-made\"><path d=\"M9 5v2h6.59l-11.59 11.59 1.41 1.41 11.59-11.59v6.59h2v-10z\"/></g>\n<g id=\"call-merge\"><path d=\"M17 20.41l1.41-1.41-3.41-3.41-1.41 1.41 3.41 3.41zm-9.5-12.41h3.5v5.59l-5.41 5.41 1.41 1.41 6-6v-6.41h3.5l-4.5-4.5-4.5 4.5z\"/></g>\n<g id=\"call-missed\"><path d=\"M19.59 7l-7.59 7.59-5.59-5.59h4.59v-2h-8v8h2v-4.59l7 7 9-9z\"/></g>\n<g id=\"call-received\"><path d=\"M20 5.41l-1.41-1.41-11.59 11.59v-6.59h-2v10h10v-2h-6.59z\"/></g>\n<g id=\"call-split\"><path d=\"M14 4l2.29 2.29-2.88 2.88 1.42 1.42 2.88-2.88 2.29 2.29v-6zm-4 0h-6v6l2.29-2.29 4.71 4.7v7.59h2v-8.41l-5.29-5.3z\"/></g>\n<g id=\"chat\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-14 7h12v2h-12v-2zm8 5h-8v-2h8v2zm4-6h-12v-2h12v2z\"/></g>\n<g id=\"clear-all\"><path d=\"M5 13h14v-2h-14v2zm-2 4h14v-2h-14v2zm4-10v2h14v-2h-14z\"/></g>\n<g id=\"comment\"><path d=\"M21.99 4c0-1.1-.89-2-1.99-2h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18zm-3.99 10h-12v-2h12v2zm0-3h-12v-2h12v2zm0-3h-12v-2h12v2z\"/></g>\n<g id=\"contacts\"><path d=\"M20 0h-16v2h16v-2zm-16 24h16v-2h-16v2zm16-20h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25-2.25-1.01-2.25-2.25 1.01-2.25 2.25-2.25zm5 10.25h-10v-1.5c0-1.67 3.33-2.5 5-2.5s5 .83 5 2.5v1.5z\"/></g>\n<g id=\"dialer-sip\"><path d=\"M17 3h-1v5h1v-5zm-2 2h-2v-1h2v-1h-3v3h2v1h-2v1h3v-3zm3-2v5h1v-2h2v-3h-3zm2 2h-1v-1h1v1zm0 10.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.01.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.27-.26.35-.65.24-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z\"/></g>\n<g id=\"dialpad\"><path d=\"M12 19c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6-18c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-6 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"dnd-on\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9l11.21 11.21c-1.35 1.06-3.05 1.69-4.9 1.69zm6.31-3.1l-11.21-11.21c1.35-1.06 3.05-1.69 4.9-1.69 4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z\"/></g>\n<g id=\"email\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"forum\"><path d=\"M21 6h-2v9h-13v2c0 .55.45 1 1 1h11l4 4v-15c0-.55-.45-1-1-1zm-4 6v-9c0-.55-.45-1-1-1h-13c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z\"/></g>\n<g id=\"hangout\"><path d=\"M11.5 2c-4.69 0-8.5 3.81-8.5 8.5s3.81 8.5 8.5 8.5h.5v3.5c4.86-2.34 8-7.5 8-12 0-4.69-3.81-8.5-8.5-8.5zm-.5 9l-1 2h-1.5l1-2h-1.5v-3h3v3zm4 0l-1 2h-1.5l1-2h-1.5v-3h3v3z\"/></g>\n<g id=\"hangout-video\"><path d=\"M20 4h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-2 12l-4-3.2v3.2h-8v-8h8v3.2l4-3.2v8z\"/></g>\n<g id=\"hangout-video-off\"><path d=\"M20 4h-12.18l4 4h2.18v2.18l.57.57 3.43-2.75v6.18l3.98 3.98.02-.16v-12c0-1.1-.9-2-2-2zm-17.73-3l-1.27 1.27 2 2c-.59.35-1 .99-1 1.73v12c0 1.1.9 2 2 2h14.73l2 2 1.27-1.27-19.73-19.73zm3.73 7h.73l7.27 7.27v.73h-8v-8z\"/></g>\n<g id=\"import-export\"><path d=\"M9 3l-4 3.99h3v7.01h2v-7.01h3l-4-3.99zm7 14.01v-7.01h-2v7.01h-3l4 3.99 4-3.99h-3z\"/></g>\n<g id=\"invert-colors-off\"><path d=\"M20.65 20.87l-2.35-2.35-6.3-6.29-3.56-3.57-1.42-1.41-2.75-2.75-1.27 1.27 2.78 2.78c-2.55 3.14-2.36 7.76.56 10.69 1.56 1.56 3.61 2.34 5.66 2.34 1.79 0 3.57-.59 5.03-1.78l2.7 2.7 1.27-1.27-.35-.36zm-8.65-1.28c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24 0-1.32.43-2.57 1.21-3.6l4.79 4.78v4.82zm0-14.49v4.58l7.25 7.26c1.37-2.96.84-6.57-1.6-9.01l-5.65-5.66-3.7 3.7 1.41 1.41 2.29-2.28z\"/></g>\n<g id=\"invert-colors-on\"><path d=\"M17.66 7.93l-5.66-5.66-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34 2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zm-5.66 11.66c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24s.62-3.11 1.76-4.24l4.24-4.25v14.49z\"/></g>\n<g id=\"live-help\"><path d=\"M19 2h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6 16h-2v-2h2v2zm2.07-7.75l-.9.92c-.72.73-1.17 1.33-1.17 2.83h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2h-2c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\"/></g>\n<g id=\"location-off\"><path d=\"M12 6.5c1.38 0 2.5 1.12 2.5 2.5 0 .74-.33 1.39-.83 1.85l3.63 3.63c.98-1.86 1.7-3.8 1.7-5.48 0-3.87-3.13-7-7-7-1.98 0-3.76.83-5.04 2.15l3.19 3.19c.46-.52 1.11-.84 1.85-.84zm4.37 9.6l-4.63-4.63-.11-.11-8.36-8.36-1.27 1.27 3.18 3.18c-.11.5-.18 1.02-.18 1.55 0 5.25 7 13 7 13s1.67-1.85 3.38-4.35l3.35 3.35 1.27-1.27-3.63-3.63z\"/></g>\n<g id=\"location-on\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"message\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-2 12h-12v-2h12v2zm0-3h-12v-2h12v2zm0-3h-12v-2h12v2z\"/></g>\n<g id=\"messenger\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"no-sim\"><path d=\"M18.99 5c0-1.1-.89-2-1.99-2h-7l-2.34 2.34 11.34 11.34-.01-11.68zm-15.34-1.12l-1.27 1.27 2.62 2.62v11.23c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27-17.47-17.47z\"/></g>\n<g id=\"phone\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1v3.49c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/></g>\n<g id=\"portable-wifi-off\"><path d=\"M17.56 14.24c.28-.69.44-1.45.44-2.24 0-3.31-2.69-6-6-6-.79 0-1.55.16-2.24.44l1.62 1.62c.2-.03.41-.06.62-.06 2.21 0 4 1.79 4 4 0 .21-.02.42-.05.63l1.61 1.61zm-5.56-10.24c4.42 0 8 3.58 8 8 0 1.35-.35 2.62-.95 3.74l1.47 1.47c.94-1.52 1.48-3.3 1.48-5.21 0-5.52-4.48-10-10-10-1.91 0-3.69.55-5.21 1.47l1.46 1.46c1.12-.59 2.4-.93 3.75-.93zm-8.73-1.5l-1.27 1.27 2.1 2.1c-1.31 1.7-2.1 3.82-2.1 6.13 0 3.7 2.01 6.92 4.99 8.65l1-1.73c-2.38-1.39-3.99-3.96-3.99-6.92 0-1.76.57-3.38 1.53-4.69l1.43 1.44c-.6.93-.96 2.05-.96 3.25 0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-.65.17-1.25.44-1.79l1.58 1.58-.02.21c0 1.1.9 2 2 2l.21-.02.01.01 7.51 7.51 1.27-1.27-16.73-16.73-1-1z\"/></g>\n<g id=\"quick-contacts-dialer\"><path d=\"M22 3h-20c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2l.01-14c0-1.1-.9-2-2-2zm-14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm3.85-4h1.64l1.51 2-1.99 1.99c-1.31-.98-2.28-2.38-2.73-3.99-.18-.64-.28-1.31-.28-2s.1-1.36.28-2c.45-1.62 1.42-3.01 2.73-3.99l1.99 1.99-1.51 2h-1.64c-.22.63-.35 1.3-.35 2s.13 1.37.35 2z\"/></g>\n<g id=\"quick-contacts-mail\"><path d=\"M21 8v-1l-3 2-3-2v1l3 2 3-2zm1-5h-20c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2l.01-14c0-1.1-.9-2-2-2zm-14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm8-6h-8v-6h8v6z\"/></g>\n<g id=\"ring-volume\"><path d=\"M23.71 16.67c-3.05-2.89-7.17-4.67-11.71-4.67-4.54 0-8.66 1.78-11.71 4.67-.18.18-.29.43-.29.71 0 .28.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73s3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.66 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71 0-.27-.11-.52-.29-.7zm-2.55-10.41l-1.41-1.41-3.56 3.55 1.41 1.41s3.45-3.52 3.56-3.55zm-8.16-4.26h-2v5h2v-5zm-6.6 7.81l1.41-1.41-3.55-3.56-1.42 1.42c.11.03 3.56 3.55 3.56 3.55z\"/></g>\n<g id=\"stay-current-landscape\"><path d=\"M1.01 7l-.01 10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-18c-1.1 0-1.99.9-1.99 2zm17.99 0v10h-14v-10h14z\"/></g>\n<g id=\"stay-current-portrait\"><path d=\"M17 1.01l-10-.01c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"stay-primary-landscape\"><path d=\"M1.01 7l-.01 10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-18c-1.1 0-1.99.9-1.99 2zm17.99 0v10h-14v-10h14z\"/></g>\n<g id=\"stay-primary-portrait\"><path d=\"M17 1.01l-10-.01c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"swap-calls\"><path d=\"M18 4l-4 4h3v7c0 1.1-.9 2-2 2s-2-.9-2-2v-7c0-2.21-1.79-4-4-4s-4 1.79-4 4v7h-3l4 4 4-4h-3v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 2.21 1.79 4 4 4s4-1.79 4-4v-7h3l-4-4z\"/></g>\n<g id=\"textsms\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-11 9h-2v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2z\"/></g>\n<g id=\"voicemail\"><path d=\"M18.5 6c-3.04 0-5.5 2.46-5.5 5.5 0 1.33.47 2.55 1.26 3.5h-4.52c.79-.95 1.26-2.17 1.26-3.5 0-3.04-2.46-5.5-5.5-5.5s-5.5 2.46-5.5 5.5 2.46 5.5 5.5 5.5h13c3.04 0 5.5-2.46 5.5-5.5s-2.46-5.5-5.5-5.5zm-13 9c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5zm13 0c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g>\n<g id=\"vpn-key\"><path d=\"M12.65 10c-.82-2.33-3.04-4-5.65-4-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4h4.35v4h4v-4h2v-4h-10.35zm-5.65 4c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/core-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<!--\n\n`core-icons` is a utitliy import that includes the definition for the `core-icon` element, `core-iconset-svg` element, as well as an import for the default icon set.\n\nThe `core-icons` directory also includes imports for additional icon sets that can be loaded into your project.\n\nExample loading icon set:\n\n    <link rel=\"import\" href=\"../core-icons/maps-icons.html\">\n\nTo use an icon from one of these sets, first prefix your `core-icon` with the icon set name, followed by a colon, \":\", and then the icon id.\n\nExample using the directions-bus icon from the maps icon set:\n\n    <core-icon icon=\"maps:directions-bus\"></core-icon>\n\n\nSee [core-icon](#core-icon) for more information about working with icons.\n\nSee [core-iconset](#core-iconset) and [core-iconset-svg](#core-iconset-svg) for more information about how to create a custom iconset.\n\n@group Polymer Core Elements\n@homepage polymer.github.io\n-->\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"icons\" iconSize=\"24\">\n<svg><defs>\n<g id=\"accessibility\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6h-2v-13h-6v-2h18v2z\"/></g>\n<g id=\"account-balance\"><path d=\"M4 10v7h3v-7h-3zm6 0v7h3v-7h-3zm-8 12h19v-3h-19v3zm14-12v7h3v-7h-3zm-4.5-9l-9.5 5v2h19v-2l-9.5-5z\"/></g>\n<g id=\"account-balance-wallet\"><path d=\"M21 18v1c0 1.1-.9 2-2 2h-14c-1.11 0-2-.9-2-2v-14c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10v-8h-10v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"account-box\"><path d=\"M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-14c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1h-12v-1z\"/></g>\n<g id=\"account-child\"><path d=\"M16.5 12c1.38 0 2.49-1.12 2.49-2.5s-1.11-2.5-2.49-2.5c-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5zm-7.5-1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75v2.25h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zm-7.5-1c-2.33 0-7 1.17-7 3.5v2.5h7v-2.25c0-.85.33-2.34 2.37-3.47-.87-.18-1.71-.28-2.37-.28z\"/></g>\n<g id=\"account-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\"/></g>\n<g id=\"add-box\"><path d=\"M19 3h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g>\n<g id=\"add-circle-outline\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"add-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g>\n<g id=\"add\"><path d=\"M19 13h-6v6h-2v-6h-6v-2h6v-6h2v6h6v2z\"/></g>\n<g id=\"add-shopping-cart\"><path d=\"M11 9h2v-3h3v-2h-3v-3h-2v3h-3v2h3v3zm-4 9c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm10 0c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-9.83-3.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.86-7.01-1.74-.96h-.01l-1.1 2-2.76 5h-7.02l-.13-.27-2.24-4.73-.95-2-.94-2h-3.27v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.13 0-.25-.11-.25-.25z\"/></g>\n<g id=\"alarm-add\"><path d=\"M7.88 3.39l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm14.12 2.33l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-10-1.72c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\"/></g>\n<g id=\"alarm-off\"><path d=\"M12 6c3.87 0 7 3.13 7 7 0 .84-.16 1.65-.43 2.4l1.52 1.52c.58-1.19.91-2.51.91-3.92 0-4.97-4.03-9-9-9-1.41 0-2.73.33-3.92.91l1.52 1.52c.75-.27 1.56-.43 2.4-.43zm10-.28l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-19.08-3.43l-1.27 1.28 1.33 1.33-1.11.93 1.42 1.42 1.11-.94.8.8c-1.37 1.58-2.2 3.64-2.2 5.89 0 4.97 4.02 9 9 9 2.25 0 4.31-.83 5.89-2.2l2.2 2.2 1.27-1.27-17.47-17.46-.97-.98zm13.55 16.1c-1.21 1-2.77 1.61-4.47 1.61-3.87 0-7-3.13-7-7 0-1.7.61-3.26 1.61-4.47l9.86 9.86zm-8.45-15.11l-1.42-1.42-.86.71 1.42 1.42.86-.71z\"/></g>\n<g id=\"alarm-on\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.12.61c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-1.46-5.47l-2.13-2.13-1.06 1.06 3.18 3.18 6-6-1.06-1.06-4.93 4.95z\"/></g>\n<g id=\"alarm\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.62 4.61h-1.5v6l4.75 2.85.75-1.23-4-2.37v-5.25zm-.5-4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"android\"><path d=\"M6 18c0 .55.45 1 1 1h1v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h2v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h1c.55 0 1-.45 1-1v-10h-12v10zm-2.5-10c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm17 0c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm-4.97-5.84l1.3-1.3c.2-.2.2-.51 0-.71-.2-.2-.51-.2-.71 0l-1.48 1.48c-.79-.4-1.69-.63-2.64-.63-.96 0-1.86.23-2.66.63l-1.49-1.48c-.2-.2-.51-.2-.71 0-.2.2-.2.51 0 .71l1.31 1.31c-1.48 1.09-2.45 2.84-2.45 4.83h12c0-1.99-.97-3.75-2.47-4.84zm-5.53 2.84h-1v-1h1v1zm5 0h-1v-1h1v1z\"/></g>\n<g id=\"announcement\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7 9h-2v-6h2v6zm0 4h-2v-2h2v2z\"/></g>\n<g id=\"apps\"><path d=\"M4 8h4v-4h-4v4zm6 12h4v-4h-4v4zm-6 0h4v-4h-4v4zm0-6h4v-4h-4v4zm6 0h4v-4h-4v4zm6-10v4h4v-4h-4zm-6 4h4v-4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"/></g>\n<g id=\"archive\"><path d=\"M20.54 5.23l-1.39-1.68c-.27-.34-.68-.55-1.15-.55h-12c-.47 0-.88.21-1.16.55l-1.38 1.68c-.29.34-.46.79-.46 1.27v12.5c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12.5c0-.48-.17-.93-.46-1.27zm-8.54 12.27l-5.5-5.5h3.5v-2h4v2h3.5l-5.5 5.5zm-6.88-12.5l.81-1h12l.94 1h-13.75z\"/></g>\n<g id=\"arrow-back\"><path d=\"M20 11h-12.17l5.59-5.59-1.42-1.41-8 8 8 8 1.41-1.41-5.58-5.59h12.17v-2z\"/></g>\n<g id=\"arrow-drop-down-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 12l-4-4h8l-4 4z\"/></g>\n<g id=\"arrow-drop-down\"><path d=\"M7 10l5 5 5-5z\"/></g>\n<g id=\"arrow-drop-up\"><path d=\"M7 14l5-5 5 5z\"/></g>\n<g id=\"arrow-forward\"><path d=\"M12 4l-1.41 1.41 5.58 5.59h-12.17v2h12.17l-5.58 5.59 1.41 1.41 8-8z\"/></g>\n<g id=\"aspect-ratio\"><path d=\"M19 12h-2v3h-3v2h5v-5zm-12-3h3v-2h-5v5h2v-3zm14-6h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"assessment\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g>\n<g id=\"assignment-ind\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 4c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1.4c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1.4z\"/></g>\n<g id=\"assignment-late\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6 15h-2v-2h2v2zm0-4h-2v-6h2v6zm-1-9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"assignment\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14h-7v-2h7v2zm3-4h-10v-2h10v2zm0-4h-10v-2h10v2z\"/></g>\n<g id=\"assignment-returned\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3v-4h4v4h3l-5 5z\"/></g>\n<g id=\"assignment-return\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm4 12h-4v3l-5-5 5-5v3h4v4z\"/></g>\n<g id=\"assignment-turned-in\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-2 14l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g>\n<g id=\"attachment\"><path d=\"M7.5 18c-3.04 0-5.5-2.46-5.5-5.5s2.46-5.5 5.5-5.5h10.5c2.21 0 4 1.79 4 4s-1.79 4-4 4h-8.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5h7.5v1.5h-7.5c-.55 0-1 .45-1 1s.45 1 1 1h8.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5h-10.5c-2.21 0-4 1.79-4 4s1.79 4 4 4h9.5v1.5h-9.5z\"/></g>\n<g id=\"autorenew\"><path d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26l1.46-1.46c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74l-1.46 1.46c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"/></g>\n<g id=\"backspace\"><path d=\"M22 3h-15c-.69 0-1.23.35-1.59.88l-5.41 8.12 5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-3 12.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g>\n<g id=\"backup\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g>\n<g id=\"block\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-8 10c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69l-11.21 11.21c-1.06-1.35-1.69-3.05-1.69-4.9zm8 8c-1.85 0-3.55-.63-4.9-1.69l11.21-11.21c1.06 1.35 1.69 3.05 1.69 4.9 0 4.42-3.58 8-8 8z\"/></g>\n<g id=\"bookmark-outline\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g>\n<g id=\"bookmark\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"book\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g>\n<g id=\"bug-report\"><path d=\"M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96l1.63-1.63-1.41-1.41-2.17 2.17c-.46-.11-.93-.17-1.42-.17-.49 0-.96.06-1.41.17l-2.18-2.17-1.41 1.41 1.62 1.63c-.74.51-1.36 1.18-1.81 1.96h-2.81v2h2.09c-.05.33-.09.66-.09 1v1h-2v2h2v1c0 .34.04.67.09 1h-2.09v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3h2.81v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1h2.09v-2zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z\"/></g>\n<g id=\"cached\"><path d=\"M19 8l-4 4h3c0 3.31-2.69 6-6 6-1.01 0-1.97-.25-2.8-.7l-1.46 1.46c1.23.78 2.69 1.24 4.26 1.24 4.42 0 8-3.58 8-8h3l-4-4zm-13 4c0-3.31 2.69-6 6-6 1.01 0 1.97.25 2.8.7l1.46-1.46c-1.23-.78-2.69-1.24-4.26-1.24-4.42 0-8 3.58-8 8h-3l4 4 4-4h-3z\"/></g>\n<g id=\"cancel\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm5 13.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g>\n<g id=\"check-box-outline-blank\"><path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"check-box\"><path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></g>\n<g id=\"check\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g>\n<g id=\"chevron-left\"><path d=\"M15.41 7.41l-1.41-1.41-6 6 6 6 1.41-1.41-4.58-4.59z\"/></g>\n<g id=\"chevron-right\"><path d=\"M10 6l-1.41 1.41 4.58 4.59-4.58 4.59 1.41 1.41 6-6z\"/></g>\n<g id=\"class\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g>\n<g id=\"clear\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g>\n<g id=\"close\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g>\n<g id=\"cloud-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm4.5 14h-8.5c-1.66 0-3-1.34-3-3s1.34-3 3-3l.14.01c.44-1.73 1.99-3.01 3.86-3.01 2.21 0 4 1.79 4 4h.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"cloud-done\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-9.35 6.96l-3.5-3.5 1.41-1.41 2.09 2.08 5.18-5.17 1.41 1.41-6.59 6.59z\"/></g>\n<g id=\"cloud-download\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-2.35 2.96l-5 5-5-5h3v-4h4v4h3z\"/></g>\n<g id=\"cloud-off\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-1.48 0-2.85.43-4.01 1.17l1.46 1.46c.76-.4 1.63-.63 2.55-.63 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3 0 1.13-.64 2.11-1.56 2.62l1.45 1.45c1.27-.91 2.11-2.39 2.11-4.07 0-2.64-2.05-4.78-4.65-4.96zm-16.35-4.77l2.75 2.74c-3.19.14-5.75 2.76-5.75 5.99 0 3.31 2.69 6 6 6h11.73l2 2 1.27-1.27-16.73-16.73-1.27 1.27zm4.73 4.73l8 8h-9.73c-2.21 0-4-1.79-4-4s1.79-4 4-4h1.73z\"/></g>\n<g id=\"cloud\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z\"/></g>\n<g id=\"cloud-queue\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-.35 7.96h-13c-2.21 0-4-1.79-4-4s1.79-4 4-4h.71c.66-2.31 2.77-4 5.29-4 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3s-1.34 3-3 3z\"/></g>\n<g id=\"cloud-upload\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g>\n<g id=\"content-copy\"><path d=\"M16 1h-12c-1.1 0-2 .9-2 2v14h2v-14h12v-2zm3 4h-11c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-11v-14h11v14z\"/></g>\n<g id=\"content-cut\"><path d=\"M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4s-4 1.79-4 4 1.79 4 4 4c.59 0 1.14-.13 1.64-.36l2.36 2.36-2.36 2.36c-.5-.23-1.05-.36-1.64-.36-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64l2.36-2.36 7 7h3v-1l-12.36-12.36zm-3.64.36c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zm7-9.5l-6 6 2 2 7-7v-1z\"/></g>\n<g id=\"content-paste\"><path d=\"M19 2h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18h-14v-16h2v3h10v-3h2v16z\"/></g>\n<g id=\"create\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g>\n<g id=\"credit-card\"><path d=\"M4 12h16v6h-16z\"/><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g>\n<g id=\"dashboard\"><path d=\"M3 13h8v-10h-8v10zm0 8h8v-6h-8v6zm10 0h8v-10h-8v10zm0-18v6h8v-6h-8z\"/></g>\n<g id=\"delete\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-12h-12v12zm13-15h-3.5l-1-1h-5l-1 1h-3.5v2h14v-2z\"/></g>\n<g id=\"description\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 16h-8v-2h8v2zm0-4h-8v-2h8v2zm-3-5v-5.5l5.5 5.5h-5.5z\"/></g>\n<g id=\"developer-mode-tv\"><path d=\"M4 5h16v2h2v-2c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v2h2v-2zm3.55 8.83l-2.83-2.83 2.83-2.83-1.41-1.41-4.25 4.24 4.24 4.24 1.42-1.41zm12.45 3.17h-16v-2h-2v2c0 1.1.9 2 2 2h4v2h8v-2h4c1.1 0 1.99-.9 1.99-2v-2h-1.99v2zm2-6.01l-4.24-4.24-1.41 1.41 2.82 2.84-2.83 2.83 1.41 1.41 4.25-4.23v-.02z\"/></g>\n<g id=\"dns\"><path d=\"M20 13h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm13-16h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"done-all\"><path d=\"M18 7l-1.41-1.41-6.34 6.34 1.41 1.41 6.34-6.34zm4.24-1.41l-10.58 10.58-4.18-4.17-1.41 1.41 5.59 5.59 12-12-1.42-1.41zm-21.83 7.82l5.59 5.59 1.41-1.41-5.58-5.59-1.42 1.41z\"/></g>\n<g id=\"done\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g>\n<g id=\"drafts\"><path d=\"M21.99 8c0-.72-.37-1.35-.94-1.7l-9.05-5.3-9.05 5.3c-.57.35-.95.98-.95 1.7v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2l-.01-10zm-9.99 5l-8.26-5.16 8.26-4.84 8.26 4.84-8.26 5.16z\"/></g>\n<g id=\"drawer\"><path d=\"M20,4H4C2.8,4,2,4.8,2,6v12c0,1.2,0.8,2,2,2h16c1,0,2-0.8,2-2V6C22,4.8,21,4,20,4z M20,18h-6V6h6V18z\"/></g>\n<g id=\"error\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-2h2v2zm0-4h-2v-6h2v6z\"/></g>\n<g id=\"event\"><path d=\"M17 12h-5v5h5v-5zm-1-11v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-1v-2h-2zm3 18h-14v-11h14v11z\"/></g>\n<g id=\"exit-to-app\"><path d=\"M10.09 15.59l1.41 1.41 5-5-5-5-1.41 1.41 2.58 2.59h-9.67v2h9.67l-2.58 2.59zm8.91-12.59h-14c-1.11 0-2 .9-2 2v4h2v-4h14v14h-14v-4h-2v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"expand-less\"><path d=\"M12 8l-6 6 1.41 1.41 4.59-4.58 4.59 4.58 1.41-1.41z\"/></g>\n<g id=\"expand-more\"><path d=\"M16.59 8.59l-4.59 4.58-4.59-4.58-1.41 1.41 6 6 6-6z\"/></g>\n<g id=\"explore\"><path d=\"M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zm0-8.9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm2.19 12.19l-8.19 3.81 3.81-8.19 8.19-3.81-3.81 8.19z\"/></g>\n<g id=\"extension\"><path d=\"M20.5 11h-1.5v-4c0-1.1-.9-2-2-2h-4v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5h-4c-1.1 0-1.99.9-1.99 2v3.8h1.49c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7h-1.5v3.8c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7v1.5h3.8c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5z\"/></g>\n<g id=\"face-unlock\"><path d=\"M14.69 17.1c-.74.58-1.7.9-2.69.9s-1.95-.32-2.69-.9c-.22-.17-.53-.13-.7.09-.17.22-.13.53.09.7.91.72 2.09 1.11 3.3 1.11s2.39-.39 3.31-1.1c.22-.17.26-.48.09-.7-.17-.23-.49-.26-.71-.1z\"/><circle cx=\"8.5\" cy=\"12.5\" r=\"1\"/><path d=\"M12 0c-6.63 0-12 5.37-12 12s5.37 12 12 12 12-5.37 12-12-5.37-12-12-12zm7.96 14.82c-1.09 3.74-4.27 6.46-8.04 6.46-3.78 0-6.96-2.72-8.04-6.47-1.19-.11-2.13-1.18-2.13-2.52 0-1.27.85-2.31 1.97-2.5 2.09-1.46 3.8-3.49 4.09-5.05v-.01c1.35 2.63 6.3 5.19 11.83 5.06l.3-.03c1.28 0 2.31 1.14 2.31 2.54 0 1.38-1.02 2.51-2.29 2.52z\"/><circle cx=\"15.5\" cy=\"12.5\" r=\"1\"/></g>\n<g id=\"favorite-outline\"><path d=\"M16.5 3c-1.74 0-3.41.81-4.5 2.09-1.09-1.28-2.76-2.09-4.5-2.09-3.08 0-5.5 2.42-5.5 5.5 0 3.78 3.4 6.86 8.55 11.54l1.45 1.31 1.45-1.32c5.15-4.67 8.55-7.75 8.55-11.53 0-3.08-2.42-5.5-5.5-5.5zm-4.4 15.55l-.1.1-.1-.1c-4.76-4.31-7.9-7.16-7.9-10.05 0-2 1.5-3.5 3.5-3.5 1.54 0 3.04.99 3.57 2.36h1.87c.52-1.37 2.02-2.36 3.56-2.36 2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z\"/></g>\n<g id=\"favorite\"><path d=\"M12 21.35l-1.45-1.32c-5.15-4.67-8.55-7.75-8.55-11.53 0-3.08 2.42-5.5 5.5-5.5 1.74 0 3.41.81 4.5 2.09 1.09-1.28 2.76-2.09 4.5-2.09 3.08 0 5.5 2.42 5.5 5.5 0 3.78-3.4 6.86-8.55 11.54l-1.45 1.31z\"/></g>\n<g id=\"file-download\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g>\n<g id=\"file-map\"><path d=\"M12 6.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm7-5.5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6.5 16h-1c-.95-4.09-3.99-5.84-3.99-9 0-2.49 2-4.5 4.49-4.5s4.51 2.01 4.51 4.5c0 3.16-3.06 4.91-4.01 9z\"/></g>\n<g id=\"file-upload\"><path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2h-14z\"/></g>\n<g id=\"filter-list\"><path d=\"M10 18h4v-2h-4v2zm-7-12v2h18v-2h-18zm3 7h12v-2h-12v2z\"/></g>\n<g id=\"find-in-page\"><path d=\"M20 19.59v-11.59l-6-6h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84zm-11-6.59c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z\"/></g>\n<g id=\"find-replace\"><path d=\"M11 6c1.38 0 2.63.56 3.54 1.46l-2.54 2.54h6v-6l-2.05 2.05c-1.27-1.27-3.02-2.05-4.95-2.05-3.53 0-6.43 2.61-6.92 6h2.02c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14h-2.02c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46l2.54-2.54h-6v6l2.05-2.05c1.27 1.27 3.02 2.05 4.95 2.05 1.55 0 2.98-.51 4.14-1.36l4.86 4.85 1.49-1.49-4.85-4.86z\"/></g>\n<g id=\"flag\"><path d=\"M14.4 6l-.4-2h-9v17h2v-7h5.6l.4 2h7v-10z\"/></g>\n<g id=\"flip-to-back\"><path d=\"M9 7h-2v2h2v-2zm0 4h-2v2h2v-2zm0-8c-1.11 0-2 .9-2 2h2v-2zm4 12h-2v2h2v-2zm6-12v2h2c0-1.1-.9-2-2-2zm-6 0h-2v2h2v-2zm-4 14v-2h-2c0 1.1.89 2 2 2zm10-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm-14-10h-2v12c0 1.1.89 2 2 2h12v-2h-12v-12zm10-2h2v-2h-2v2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"flip-to-front\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm2 4v-2h-2c0 1.1.89 2 2 2zm-2-12h2v-2h-2v2zm12 12h2v-2h-2v2zm4-18h-10c-1.11 0-2 .9-2 2v10c0 1.1.89 2 2 2h10c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-10v-10h10v10zm-8 6h2v-2h-2v2zm-4 0h2v-2h-2v2z\"/></g>\n<g id=\"folder-open\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-16v-10h16v10z\"/></g>\n<g id=\"folder\"><path d=\"M10 4h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-8l-2-2z\"/></g>\n<g id=\"folder-shared\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-5 3c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 8h-8v-1c0-1.33 2.67-2 4-2s4 .67 4 2v1z\"/></g>\n<g id=\"forward\"><path d=\"M12 8v-4l8 8-8 8v-4h-8v-8z\"/></g>\n<g id=\"fullscreen-exit\"><path d=\"M5 16h3v3h2v-5h-5v2zm3-8h-3v2h5v-5h-2v3zm6 11h2v-3h3v-2h-5v5zm2-11v-3h-2v5h5v-2h-3z\"/></g>\n<g id=\"fullscreen\"><path d=\"M7 14h-2v5h5v-2h-3v-3zm-2-4h2v-3h3v-2h-5v5zm12 7h-3v2h5v-5h-2v3zm-3-12v2h3v3h2v-5h-5z\"/></g>\n<g id=\"gesture\"><path d=\"M4.59 6.89c.7-.71 1.4-1.35 1.71-1.22.5.2 0 1.03-.3 1.52-.25.42-2.86 3.89-2.86 6.31 0 1.28.48 2.34 1.34 2.98.75.56 1.74.73 2.64.46 1.07-.31 1.95-1.4 3.06-2.77 1.21-1.49 2.83-3.44 4.08-3.44 1.63 0 1.65 1.01 1.76 1.79-3.78.64-5.38 3.67-5.38 5.37 0 1.7 1.44 3.09 3.21 3.09 1.63 0 4.29-1.33 4.69-6.1h2.46v-2.5h-2.47c-.15-1.65-1.09-4.2-4.03-4.2-2.25 0-4.18 1.91-4.94 2.84-.58.73-2.06 2.48-2.29 2.72-.25.3-.68.84-1.11.84-.45 0-.72-.83-.36-1.92.35-1.09 1.4-2.86 1.85-3.52.78-1.14 1.3-1.92 1.3-3.28 0-2.17-1.64-2.86-2.51-2.86-1.32 0-2.47 1-2.72 1.25-.36.36-.66.66-.88.93l1.75 1.71zm9.29 11.66c-.31 0-.74-.26-.74-.72 0-.6.73-2.2 2.87-2.76-.3 2.69-1.43 3.48-2.13 3.48z\"/></g>\n<g id=\"get-app\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g>\n<g id=\"grade\"><path d=\"M12 17.27l6.18 3.73-1.64-7.03 5.46-4.73-7.19-.61-2.81-6.63-2.81 6.63-7.19.61 5.46 4.73-1.64 7.03z\"/></g>\n<g id=\"group-work\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-4 15.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zm1.5-9.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5-2.5-1.12-2.5-2.5zm6.5 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"help\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92c-.72.73-1.17 1.33-1.17 2.83h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2h-2c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\"/></g>\n<g id=\"highlight-remove\"><path d=\"M14.59 8l-2.59 2.59-2.59-2.59-1.41 1.41 2.59 2.59-2.59 2.59 1.41 1.41 2.59-2.59 2.59 2.59 1.41-1.41-2.59-2.59 2.59-2.59-1.41-1.41zm-2.59-6c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"history\"><path opacity=\".9\" d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g>\n<g id=\"home\"><path d=\"M10 20v-6h4v6h5v-8h3l-10-9-10 9h3v8z\"/></g>\n<g id=\"https\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g>\n<g id=\"inbox\"><path d=\"M19 3h-14.01c-1.1 0-1.98.9-1.98 2l-.01 14c0 1.1.89 2 1.99 2h14.01c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 12h-4c0 1.66-1.34 3-3 3s-3-1.34-3-3h-4.01v-10h14.01v10zm-3-5h-2v-3h-4v3h-2l4 4 4-4z\"/></g>\n<g id=\"info-outline\"><path d=\"M11 17h2v-6h-2v6zm1-15c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-11h2v-2h-2v2z\"/></g>\n<g id=\"info\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-6h2v6zm0-8h-2v-2h2v2z\"/></g>\n<g id=\"input\"><path d=\"M21 3.01h-18c-1.1 0-2 .9-2 2v3.99h2v-4.01h18v14.03h-18v-4.02h-2v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zm-10 12.99l4-4-4-4v3h-10v2h10v3z\"/></g>\n<g id=\"invert-colors\"><path d=\"M17.66 7.93l-5.66-5.66-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34 2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zm-5.66 11.66c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24s.62-3.11 1.76-4.24l4.24-4.25v14.49z\"/></g>\n<g id=\"label-outline\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16zm-1.63 11.16h-11v-10h11l3.55 5-3.55 5z\"/></g>\n<g id=\"label\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16z\"/></g>\n<g id=\"language\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zm-6.92-3.96c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zm-7.74 9.96c-.16-.64-.26-1.31-.26-2s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2h-3.38zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8h-2.95c.96-1.66 2.49-2.93 4.33-3.56-.6 1.11-1.06 2.31-1.38 3.56zm3.97 11.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zm2.34-5.96h-4.68c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zm1.77-5.56c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z\"/></g>\n<g id=\"launch\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g>\n<g id=\"link\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4v-1.9h-4c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9h-4c-1.71 0-3.1-1.39-3.1-3.1zm4.1 1h8v-2h-8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4v1.9h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></g>\n<g id=\"list\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm4 4h14v-2h-14v2zm0 4h14v-2h-14v2zm0-10v2h14v-2h-14z\"/></g>\n<g id=\"lock-open\"><path d=\"M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2h-9.1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-12v-10h12v10z\"/></g>\n<g id=\"lock-outline\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6-5.1c1.71 0 3.1 1.39 3.1 3.1v2h-6.1v-2h-.1c0-1.71 1.39-3.1 3.1-3.1zm6 17.1h-12v-10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></g>\n<g id=\"lock\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g>\n<g id=\"loyalty\"><path d=\"M21.41 11.58l-9-9c-.36-.36-.86-.58-1.41-.58h-7c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zm-15.91-4.58c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11.77 8.27l-4.27 4.27-4.27-4.27c-.45-.46-.73-1.08-.73-1.77 0-1.38 1.12-2.5 2.5-2.5.69 0 1.32.28 1.77.74l.73.72.73-.73c.45-.45 1.08-.73 1.77-.73 1.38 0 2.5 1.12 2.5 2.5 0 .69-.28 1.32-.73 1.77z\"/></g>\n<g id=\"mail\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"markunread-mailbox\"><path d=\"M20 6h-10v6h-2v-8h6v-4h-8v6h-2c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"markunread\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"menu\"><path d=\"M3 18h18v-2h-18v2zm0-5h18v-2h-18v2zm0-7v2h18v-2h-18z\"/></g>\n<g id=\"more-horiz\"><path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"more-vert\"><path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"note-add\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 14h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2zm-3-7v-5.5l5.5 5.5h-5.5z\"/></g>\n<g id=\"open-in-browser\"><path d=\"M19 4h-14c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2h-4v-10h14v10h-4v2h4c1.1 0 2-.9 2-2v-12c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"/></g>\n<g id=\"open-in-new\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g>\n<g id=\"open-with\"><path d=\"M10 9h4v-3h3l-5-5-5 5h3v3zm-1 1h-3v-3l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3h-3l5 5 5-5h-3v-3z\"/></g>\n<g id=\"pageview\"><path d=\"M11 8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8-5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-1.41 16l-3.83-3.83c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84-1.41 1.41z\"/></g>\n<g id=\"payment\"><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g>\n<g id=\"perm-camera-mic\"><path d=\"M20 5h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v-2.09c-2.83-.48-5-2.94-5-5.91h2c0 2.21 1.79 4 4 4s4-1.79 4-4h2c0 2.97-2.17 5.43-5 5.91v2.09h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-6 8c0 1.1-.9 2-2 2s-2-.9-2-2v-4c0-1.1.9-2 2-2s2 .9 2 2v4z\"/></g>\n<g id=\"perm-contact-cal\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z\"/></g>\n<g id=\"perm-data-setting\"><path d=\"M18.99 11.5c.34 0 .67.03 1 .07l.01-11.57-20 20h11.56c-.04-.33-.07-.66-.07-1 0-4.14 3.36-7.5 7.5-7.5zm3.71 7.99c.02-.16.04-.32.04-.49 0-.17-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.85-.49l-.19-1.32c-.01-.12-.12-.21-.24-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49 0 .17.01.33.03.49l-1.06.83c-.09.08-.12.21-.06.32l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.02.12.12.21.25.21h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.07-.83zm-3.71 1.01c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"perm-device-info\"><path d=\"M13 7h-2v2h2v-2zm0 4h-2v6h2v-6zm4-9.99l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"perm-identity\"><path d=\"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1-2.1-.94-2.1-2.1.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1h-12.2v-1.1c0-.64 3.13-2.1 6.1-2.1m0-10.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"perm-media\"><path d=\"M2 6h-2v5h.01l-.01 9c0 1.1.9 2 2 2h18v-2h-18v-14zm20-2h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-15 11l4.5-6 3.5 4.51 2.5-3.01 3.5 4.5h-14z\"/></g>\n<g id=\"perm-phone-msg\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-8-12.5v10l3-3h6v-7h-9z\"/></g>\n<g id=\"perm-scan-wifi\"><path d=\"M12 3c-5.05 0-8.85 1.85-12 4.23l12 14.77 12-14.75c-3.15-2.38-6.95-4.25-12-4.25zm1 13h-2v-6h2v6zm-2-8v-2h2v2h-2z\"/></g>\n<g id=\"picture-in-picture\"><path d=\"M19 7h-8v6h8v-6zm2-4h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.03h18v14.03z\"/></g>\n<g id=\"polymer\"><path d=\"M19 4h-4l-7.89 12.63-2.61-4.63 4.5-8h-4l-4.5 8 4.5 8h4l7.89-12.63 2.61 4.63-4.5 8h4l4.5-8z\"/></g>\n<g id=\"print\"><path d=\"M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11h-8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9h-12v4h12v-4z\"/></g>\n<g id=\"query-builder\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g>\n<g id=\"question-answer\"><path d=\"M21 6h-2v9h-13v2c0 .55.45 1 1 1h11l4 4v-15c0-.55-.45-1-1-1zm-4 6v-9c0-.55-.45-1-1-1h-13c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z\"/></g>\n<g id=\"radio-button-off\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"radio-button-on\"><path d=\"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"receipt\"><path d=\"M18 17h-12v-2h12v2zm0-4h-12v-2h12v2zm0-4h-12v-2h12v2zm-15 13l1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5v-20l-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5v20z\"/></g>\n<g id=\"redeem\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g>\n<g id=\"redo\"><path d=\"M18.4 10.6c-1.85-1.61-4.25-2.6-6.9-2.6-4.65 0-8.58 3.03-9.96 7.22l2.36.78c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88l-3.62 3.62h9v-9l-3.6 3.6z\"/></g>\n<g id=\"refresh\"><path d=\"M17.65 6.35c-1.45-1.45-3.44-2.35-5.65-2.35-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78l-3.22 3.22h7v-7l-2.35 2.35z\"/></g>\n<g id=\"remove-circle-outline\"><path d=\"M7 11v2h10v-2h-10zm5-9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"remove-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-10v-2h10v2z\"/></g>\n<g id=\"remove\"><path d=\"M19 13h-14v-2h14v2z\"/></g>\n<g id=\"reorder\"><path d=\"M3,15h18v-2H3V15z M3,19h18v-2H3V19z M3,11h18V9H3V11z M3,5v2h18V5H3z\"/></g>\n<g id=\"reply-all\"><path d=\"M7 8v-3l-7 7 7 7v-3l-4-4 4-4zm6 1v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g>\n<g id=\"reply\"><path d=\"M10 9v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g>\n<g id=\"report\"><path d=\"M15.73 3h-7.46l-5.27 5.27v7.46l5.27 5.27h7.46l5.27-5.27v-7.46l-5.27-5.27zm-3.73 14.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2v-6h2v6z\"/></g>\n<g id=\"report-problem\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g>\n<g id=\"restore\"><path d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g>\n<g id=\"room\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"rotation-3d\"><path d=\"M7.52 21.48c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.81-1.33 1.32zm.89-6.52c-.19 0-.37-.03-.52-.08-.16-.06-.29-.13-.4-.24-.11-.1-.2-.22-.26-.37-.06-.14-.09-.3-.09-.47h-1.3c0 .36.07.68.21.95.14.27.33.5.56.69.24.18.51.32.82.41.3.1.62.15.96.15.37 0 .72-.05 1.03-.15.32-.1.6-.25.83-.44s.42-.43.55-.72c.13-.29.2-.61.2-.97 0-.19-.02-.38-.07-.56-.05-.18-.12-.35-.23-.51-.1-.16-.24-.3-.4-.43-.17-.13-.37-.23-.61-.31.2-.09.37-.2.52-.33.15-.13.27-.27.37-.42.1-.15.17-.3.22-.46.05-.16.07-.32.07-.48 0-.36-.06-.68-.18-.96-.12-.28-.29-.51-.51-.69-.2-.19-.47-.33-.77-.43-.31-.09-.65-.14-1.02-.14-.36 0-.69.05-1 .16-.3.11-.57.26-.79.45-.21.19-.38.41-.51.67-.12.26-.18.54-.18.85h1.3c0-.17.03-.32.09-.45s.14-.25.25-.34c.11-.09.23-.17.38-.22.15-.05.3-.08.48-.08.4 0 .7.1.89.31.19.2.29.49.29.86 0 .18-.03.34-.08.49-.05.15-.14.27-.25.37-.11.1-.25.18-.41.24-.16.06-.36.09-.58.09h-.77v1.03h.77c.22 0 .42.02.6.07s.33.13.45.23c.12.11.22.24.29.4.07.16.1.35.1.57 0 .41-.12.72-.35.93-.23.23-.55.33-.95.33zm8.55-5.92c-.32-.33-.7-.59-1.14-.77-.43-.18-.92-.27-1.46-.27h-2.36v8h2.3c.55 0 1.06-.09 1.51-.27.45-.18.84-.43 1.16-.76.32-.33.57-.73.74-1.19.17-.47.26-.99.26-1.57v-.4c0-.58-.09-1.1-.26-1.57-.18-.47-.43-.87-.75-1.2zm-.39 3.16c0 .42-.05.79-.14 1.13-.1.33-.24.62-.43.85-.19.23-.43.41-.71.53-.29.12-.62.18-.99.18h-.91v-5.77h.97c.72 0 1.27.23 1.64.69.38.46.57 1.12.57 1.99v.4zm-4.57-12.2l-.66.03 3.81 3.81 1.33-1.33c3.27 1.55 5.61 4.72 5.96 8.48h1.5c-.5-6.15-5.65-10.99-11.94-10.99z\"/></g>\n<g id=\"save\"><path d=\"M17 3h-12c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-12l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10h-10v-4h10v4z\"/></g>\n<g id=\"schedule\"><path fill-opacity=\".9\" d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path fill-opacity=\".9\" d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g>\n<g id=\"search\"><path d=\"M15.5 14h-.79l-.28-.27c.98-1.14 1.57-2.62 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 2.91-6.5 6.5 2.91 6.5 6.5 6.5c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99 1.49-1.49-4.99-5zm-6 0c-2.49 0-4.5-2.01-4.5-4.5s2.01-4.5 4.5-4.5 4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5z\"/></g>\n<g id=\"select-all\"><path d=\"M3 5h2v-2c-1.1 0-2 .9-2 2zm0 8h2v-2h-2v2zm4 8h2v-2h-2v2zm-4-12h2v-2h-2v2zm10-6h-2v2h2v-2zm6 0v2h2c0-1.1-.9-2-2-2zm-14 18v-2h-2c0 1.1.9 2 2 2zm-2-4h2v-2h-2v2zm6-14h-2v2h2v-2zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2v-2h-2v2zm-8 12h10v-10h-10v10zm2-8h6v6h-6v-6z\"/></g>\n<g id=\"send-money\"><path d=\"M2 12c0-2.61 1.67-4.83 4-5.65v-2.09c-3.45.89-6 4.01-6 7.74s2.55 6.85 6 7.74v-2.09c-2.33-.82-4-3.04-4-5.65zm22 0l-4-4v3h-7v2h7v3l4-4zm-10 6c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.16.67 4.24 1.76l1.42-1.41c-1.45-1.45-3.45-2.35-5.66-2.35-4.42 0-8 3.58-8 8s3.58 8 8 8c2.21 0 4.21-.9 5.66-2.34l-1.42-1.41c-1.08 1.08-2.58 1.75-4.24 1.75z\"/></g>\n<g id=\"send\"><path d=\"M2.01 21l20.99-9-20.99-9-.01 7 15 2-15 2z\"/></g>\n<g id=\"settings-applications\"><path d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm7-7h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2v-14c0-1.1-.89-2-2-2zm-1.75 9c0 .23-.02.46-.05.68l1.48 1.16c.13.11.17.3.08.45l-1.4 2.42c-.09.15-.27.21-.43.15l-1.74-.7c-.36.28-.76.51-1.18.69l-.26 1.85c-.03.17-.18.3-.35.3h-2.8c-.17 0-.32-.13-.35-.29l-.26-1.85c-.43-.18-.82-.41-1.18-.69l-1.74.7c-.16.06-.34 0-.43-.15l-1.4-2.42c-.09-.15-.05-.34.08-.45l1.48-1.16c-.03-.23-.05-.46-.05-.69 0-.23.02-.46.05-.68l-1.48-1.16c-.13-.11-.17-.3-.08-.45l1.4-2.42c.09-.15.27-.21.43-.15l1.74.7c.36-.28.76-.51 1.18-.69l.26-1.85c.03-.17.18-.3.35-.3h2.8c.17 0 .32.13.35.29l.26 1.85c.43.18.82.41 1.18.69l1.74-.7c.16-.06.34 0 .43.15l1.4 2.42c.09.15.05.34-.08.45l-1.48 1.16c.03.23.05.46.05.69z\"/></g>\n<g id=\"settings-backup-restore\"><path d=\"M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9h-3l4 4 4-4h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44c1.52 1.16 3.42 1.86 5.48 1.86 4.97 0 9-4.03 9-9s-4.03-9-9-9z\"/></g>\n<g id=\"settings-bluetooth\"><path d=\"M11 24h2v-2h-2v2zm-4 0h2v-2h-2v2zm8 0h2v-2h-2v2zm2.71-18.29l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"settings-cell\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm1-23.99l-8-.01c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-16c0-1.1-.9-1.99-2-1.99zm0 15.99h-8v-12h8v12z\"/></g>\n<g id=\"settings-display\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02zm-13-3.01h2.5l1.5 1.5 1.5-1.5h2.5v-2.5l1.5-1.5-1.5-1.5v-2.5h-2.5l-1.5-1.5-1.5 1.5h-2.5v2.5l-1.5 1.5 1.5 1.5v2.5zm4-7c1.66 0 3 1.34 3 3s-1.34 3-3 3v-6z\"/></g>\n<g id=\"settings-ethernet\"><path d=\"M7.77 6.76l-1.54-1.28-5.41 6.52 5.41 6.52 1.54-1.28-4.35-5.24 4.35-5.24zm-.77 6.24h2v-2h-2v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28 4.35 5.24-4.35 5.24 1.54 1.28 5.41-6.52-5.41-6.52z\"/></g>\n<g id=\"settings-input-antenna\"><path d=\"M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5c0 1.02.62 1.9 1.5 2.29v3.3l-3.41 3.41 1.41 1.41 3-3 3 3 1.41-1.41-3.41-3.41v-3.3zm-1-13.29c-6.07 0-11 4.93-11 11h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z\"/></g>\n<g id=\"settings-input-component\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g>\n<g id=\"settings-input-composite\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g>\n<g id=\"settings-input-hdmi\"><path d=\"M18 7v-3c0-1.1-.9-2-2-2h-8c-1.1 0-2 .9-2 2v3h-1v6l3 6v3h8v-3l3-6v-6h-1zm-10-3h8v3h-2v-2h-1v2h-2v-2h-1v2h-2v-3z\"/></g>\n<g id=\"settings-input-svideo\"><path d=\"M8 11.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5.67 1.5 1.5 1.5 1.5-.67 1.5-1.5zm7-5c0-.83-.67-1.5-1.5-1.5h-3c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5h3c.83 0 1.5-.67 1.5-1.5zm-6.5 8.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm3.5-14c-6.07 0-11 4.93-11 11s4.93 11 11 11 11-4.93 11-11-4.93-11-11-11zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9zm5.5-11c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm-2 5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"/></g>\n<g id=\"settings-overscan\"><path d=\"M12.01 5.5l-2.01 2.5h4l-1.99-2.5zm5.99 4.5v4l2.5-1.99-2.5-2.01zm-12 0l-2.5 2.01 2.5 1.99v-4zm8 6h-4l2.01 2.5 1.99-2.5zm7-13h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"settings\"><path d=\"M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65c-.03-.24-.24-.42-.49-.42h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zm-7.43 2.52c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g>\n<g id=\"settings-phone\"><path d=\"M13 9h-2v2h2v-2zm4 0h-2v2h2v-2zm3 6.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-6.5v2h2v-2h-2z\"/></g>\n<g id=\"settings-power\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm2-22h-2v10h2v-10zm3.56 2.44l-1.45 1.45c1.73 1.05 2.89 2.94 2.89 5.11 0 3.31-2.69 6-6 6s-6-2.69-6-6c0-2.17 1.16-4.06 2.88-5.12l-1.44-1.44c-2.08 1.44-3.44 3.84-3.44 6.56 0 4.42 3.58 8 8 8s8-3.58 8-8c0-2.72-1.36-5.12-3.44-6.56zm-1.56 19.56h2v-2h-2v2z\"/></g>\n<g id=\"settings-remote\"><path d=\"M15 9h-6c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-3 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm-4.95-8.95l1.41 1.41c.91-.9 2.16-1.46 3.54-1.46s2.63.56 3.54 1.46l1.41-1.41c-1.27-1.27-3.02-2.05-4.95-2.05s-3.68.78-4.95 2.05zm4.95-6.05c-3.04 0-5.79 1.23-7.78 3.22l1.41 1.41c1.63-1.62 3.88-2.63 6.37-2.63s4.74 1.01 6.36 2.64l1.41-1.41c-1.98-2-4.73-3.23-7.77-3.23z\"/></g>\n<g id=\"settings-voice\"><path d=\"M7 24h2v-2h-2v2zm5-11c1.66 0 2.99-1.34 2.99-3l.01-6c0-1.66-1.34-3-3-3s-3 1.34-3 3v6c0 1.66 1.34 3 3 3zm-1 11h2v-2h-2v2zm4 0h2v-2h-2v2zm4-14h-1.7c0 3-2.54 5.1-5.3 5.1s-5.3-2.1-5.3-5.1h-1.7c0 3.41 2.72 6.23 6 6.72v3.28h2v-3.28c3.28-.49 6-3.31 6-6.72z\"/></g>\n<g id=\"shop\"><path d=\"M16 6v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-6v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-13h-6zm-6-2h4v2h-4v-2zm-1 14v-9l7.5 4-7.5 5z\"/></g>\n<g id=\"shopping-basket\"><path d=\"M17.21 9l-4.38-6.56c-.19-.28-.51-.42-.83-.42-.32 0-.64.14-.83.43l-4.38 6.55h-4.79c-.55 0-1 .45-1 1 0 .09.01.18.04.27l2.54 9.27c.23.84 1 1.46 1.92 1.46h13c.92 0 1.69-.62 1.93-1.46l2.54-9.27.03-.27c0-.55-.45-1-1-1h-4.79zm-8.21 0l3-4.4 3 4.4h-6zm3 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"shopping-cart\"><path d=\"M7 18c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-6-16v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1h-14.79l-.94-2h-3.27zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"shop-two\"><path d=\"M3 9h-2v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2h-16v-11zm15-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-5v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2v-11h-5zm-6-2h4v2h-4v-2zm0 12v-7l5.5 3-5.5 4z\"/></g>\n<g id=\"sort\"><path d=\"M3 18h6v-2h-6v2zm0-12v2h18v-2h-18zm0 7h12v-2h-12v2z\"/></g>\n<g id=\"speaker-notes\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-12 12h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2v-2h2v2zm7 6h-5v-2h5v2zm3-3h-8v-2h8v2zm0-3h-8v-2h8v2z\"/></g>\n<g id=\"spellcheck\"><path d=\"M12.45 16h2.09l-5.11-13h-1.86l-5.11 13h2.09l1.12-3h5.64l1.14 3zm-6.02-5l2.07-5.52 2.07 5.52h-4.14zm15.16.59l-8.09 8.09-3.67-3.68-1.41 1.41 5.09 5.09 9.49-9.5-1.41-1.41z\"/></g>\n<g id=\"star-half\"><path d=\"M22 9.74l-7.19-.62L12 2.5 9.19 9.13 2 9.74l5.46 4.73-1.64 7.03L12 17.77l6.18 3.73-1.63-7.03L22 9.74zM12 15.9V6.6l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.9z\"/></g>\n<g id=\"star-outline\"><path d=\"M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z\"/></g>\n<g id=\"star\"><path d=\"M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"/></g>\n<g id=\"star-rate\"><path d=\"M12 14.3l3.71 2.7-1.42-4.36 3.71-2.64h-4.55l-1.45-4.5-1.45 4.5h-4.55l3.71 2.64-1.42 4.36z\"/></g>\n<g id=\"stars\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm4.24 16l-4.23-2.55-4.23 2.55 1.12-4.81-3.73-3.23 4.92-.42 1.92-4.54 1.92 4.53 4.92.42-3.73 3.23 1.12 4.82z\"/></g>\n<g id=\"store\"><path d=\"M20 4h-16v2h16v-2zm1 10v-2l-1-5h-16l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4h-6v-4h6v4z\"/></g>\n<g id=\"subject\"><path d=\"M14 17h-10v2h10v-2zm6-8h-16v2h16v-2zm-16 6h16v-2h-16v2zm0-10v2h16v-2h-16z\"/></g>\n<g id=\"supervisor-account\"><circle cx=\"12\" cy=\"13.49\" r=\"1.5\"/><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 2.5c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25-2.25-1.01-2.25-2.25 1.01-2.25 2.25-2.25zm5 10.56v2.5c-.45.41-.96.77-1.5 1.05v-.68c0-.34-.17-.65-.46-.92-.65-.62-1.89-1.02-3.04-1.02-.96 0-1.96.28-2.65.73l-.17.12-.21.17c.78.47 1.63.72 2.54.82l1.33.15c.37.04.66.36.66.75 0 .29-.16.53-.4.66-.28.15-.64.09-.95.09-.35 0-.69-.01-1.03-.05-.5-.06-.99-.17-1.46-.33-.49-.16-.97-.38-1.42-.64-.22-.13-.44-.27-.65-.43l-.31-.24c-.04-.02-.28-.18-.28-.23v-4.28c0-1.58 2.63-2.78 5-2.78s5 1.2 5 2.78v1.78z\"/></g>\n<g id=\"swap-horiz\"><path d=\"M6.99 11l-3.99 4 3.99 4v-3h7.01v-2h-7.01v-3zm14.01-2l-3.99-4v3h-7.01v2h7.01v3l3.99-4z\"/></g>\n<g id=\"swap-vert-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-5.5 7l3.5-3.5 3.5 3.5h-2.5v4h-2v-4h-2.5zm11 6l-3.5 3.5-3.5-3.5h2.5v-4h2v4h2.5z\"/></g>\n<g id=\"swap-vert\"><path d=\"M16 17.01v-7.01h-2v7.01h-3l4 3.99 4-3.99h-3zm-7-14.01l-4 3.99h3v7.01h2v-7.01h3l-4-3.99z\"/></g>\n<g id=\"system-update-tv\"><path d=\"M12 16.5l4-4h-3v-9h-2v9h-3l4 4zm9-13h-6v1.99h6v14.03h-18v-14.03h6v-1.99h-6c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"tab\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-18v-14h10v4h8v10z\"/></g>\n<g id=\"tab-unselected\"><path d=\"M1 9h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2c-1.1 0-2 .9-2 2zm8 16h2v-2h-2v2zm-8-4h2v-2h-2v2zm2 4v-2h-2c0 1.1.9 2 2 2zm18-18h-8v6h10v-4c0-1.1-.9-2-2-2zm0 14h2v-2h-2v2zm-12-12h2v-2h-2v2zm-4 16h2v-2h-2v2zm0-16h2v-2h-2v2zm16 16c1.1 0 2-.9 2-2h-2v2zm0-8h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 0h2v-2h-2v2z\"/></g>\n<g id=\"text-format\"><path d=\"M5 17v2h14v-2h-14zm4.5-4.2h5l.9 2.2h2.1l-4.75-11h-1.5l-4.75 11h2.1l.9-2.2zm2.5-6.82l1.87 5.02h-3.74l1.87-5.02z\"/></g>\n<g id=\"theaters\"><path d=\"M18 3v2h-2v-2h-8v2h-2v-2h-2v18h2v-2h2v2h8v-2h2v2h2v-18h-2zm-10 14h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g>\n<g id=\"thumb-down\"><path d=\"M15 3h-9c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v1.91l.01.01-.01.08c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06l1.06 1.05 6.59-6.59c.36-.36.58-.86.58-1.41v-10c0-1.1-.9-2-2-2zm4 0v12h4v-12h-4z\"/></g>\n<g id=\"thumbs-up-down\"><path d=\"M12 6c0-.55-.45-1-1-1h-5.18l.66-3.18.02-.23c0-.31-.13-.59-.33-.8l-.79-.79-4.94 4.94c-.27.27-.44.65-.44 1.06v6.5c0 .83.67 1.5 1.5 1.5h6.75c.62 0 1.15-.38 1.38-.91l2.26-5.29c.07-.17.11-.36.11-.55v-1.25zm10.5 4h-6.75c-.62 0-1.15.38-1.38.91l-2.26 5.29c-.07.17-.11.36-.11.55v1.25c0 .55.45 1 1 1h5.18l-.66 3.18-.02.24c0 .31.13.59.33.8l.79.78 4.94-4.94c.27-.27.44-.65.44-1.06v-6.5c0-.83-.67-1.5-1.5-1.5z\"/></g>\n<g id=\"thumb-up\"><path d=\"M1 21h4v-12h-4v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06l-1.06-1.05-6.58 6.59c-.37.36-.59.86-.59 1.41v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01.01-.08z\"/></g>\n<g id=\"toc\"><path d=\"M3 9h14v-2h-14v2zm0 4h14v-2h-14v2zm0 4h14v-2h-14v2zm16 0h2v-2h-2v2zm0-10v2h2v-2h-2zm0 6h2v-2h-2v2z\"/></g>\n<g id=\"today\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11zm-12-9h5v5h-5z\"/></g>\n<g id=\"track-changes\"><path d=\"M19.07 4.93l-1.41 1.41c1.44 1.45 2.34 3.45 2.34 5.66 0 4.42-3.58 8-8 8s-8-3.58-8-8c0-4.08 3.05-7.44 7-7.93v2.02c-2.84.48-5 2.94-5 5.91 0 3.31 2.69 6 6 6s6-2.69 6-6c0-1.66-.67-3.16-1.76-4.24l-1.41 1.41c.72.73 1.17 1.73 1.17 2.83 0 2.21-1.79 4-4 4s-4-1.79-4-4c0-1.86 1.28-3.41 3-3.86v2.14c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72v-8.28h-1c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10c0-2.76-1.12-5.26-2.93-7.07z\"/></g>\n<g id=\"translate\"><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h2.93v-2h-7v-2h-2v2h-7v1.99h11.17c-.67 1.93-1.73 3.76-3.17 5.36-.93-1.03-1.7-2.16-2.31-3.35h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02 1.42 1.42 5-5 3.11 3.11.76-2.04zm5.63-5.07h-2l-4.5 12h2l1.12-3h4.75l1.13 3h2l-4.5-12zm-2.62 7l1.62-4.33 1.62 4.33h-3.24z\"/></g>\n<g id=\"trending-down\"><path d=\"M16 18l2.29-2.29-4.88-4.88-4 4-7.41-7.42 1.41-1.41 6 6 4-4 6.3 6.29 2.29-2.29v6z\"/></g>\n<g id=\"trending-neutral\"><path d=\"M22 12l-4-4v3h-15v2h15v3z\"/></g>\n<g id=\"trending-up\"><path d=\"M16 6l2.29 2.29-4.88 4.88-4-4-7.41 7.42 1.41 1.41 6-6 4 4 6.3-6.29 2.29 2.29v-6z\"/></g>\n<g id=\"turned-in-not\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g>\n<g id=\"turned-in\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"undo\"><path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6l-3.6-3.6v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78c-1.39-4.19-5.32-7.22-9.97-7.22z\"/></g>\n<g id=\"unfold-less\"><path d=\"M7.41 18.59l1.42 1.41 3.17-3.17 3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59zm9.18-13.18l-1.42-1.41-3.17 3.17-3.17-3.17-1.42 1.41 4.59 4.59 4.59-4.59z\"/></g>\n<g id=\"unfold-more\"><path d=\"M12 5.83l3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59 1.42 1.41 3.17-3.17zm0 12.34l-3.17-3.17-1.41 1.41 4.58 4.59 4.59-4.59-1.42-1.41-3.17 3.17z\"/></g>\n<g id=\"verified-user\"><path d=\"M12 1l-9 4v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12v-6l-9-4zm-2 16l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g>\n<g id=\"view-agenda\"><path d=\"M20 13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm0-10h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1z\"/></g>\n<g id=\"view-array\"><path d=\"M4 18h3v-13h-3v13zm14-13v13h3v-13h-3zm-10 13h9v-13h-9v13z\"/></g>\n<g id=\"view-carousel\"><path d=\"M7 19h10v-15h-10v15zm-5-2h4v-11h-4v11zm16-11v11h4v-11h-4z\"/></g>\n<g id=\"view-column\"><path d=\"M10 18h5v-13h-5v13zm-6 0h5v-13h-5v13zm12-13v13h5v-13h-5z\"/></g>\n<g id=\"view-day\"><path d=\"M2 21h19v-3h-19v3zm18-13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-18-5v3h19v-3h-19z\"/></g>\n<g id=\"view-headline\"><path d=\"M4 15h17v-2h-17v2zm0 4h17v-2h-17v2zm0-8h17v-2h-17v2zm0-6v2h17v-2h-17z\"/></g>\n<g id=\"view-list\"><path d=\"M4 14h4v-4h-4v4zm0 5h4v-4h-4v4zm0-10h4v-4h-4v4zm5 5h12v-4h-12v4zm0 5h12v-4h-12v4zm0-14v4h12v-4h-12z\"/></g>\n<g id=\"view-module\"><path d=\"M4 11h5v-6h-5v6zm0 7h5v-6h-5v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5v-6h-5v6zm6-6v6h5v-6h-5z\"/></g>\n<g id=\"view-quilt\"><path d=\"M10 18h5v-6h-5v6zm-6 0h5v-13h-5v13zm12 0h5v-6h-5v6zm-6-13v6h11v-6h-11z\"/></g>\n<g id=\"view-stream\"><path d=\"M4 18h17v-6h-17v6zm0-13v6h17v-6h-17z\"/></g>\n<g id=\"view-week\"><path d=\"M6 5h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1z\"/></g>\n<g id=\"visibility-off\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16c.57-.23 1.18-.36 1.83-.36zm-10-2.73l2.28 2.28.46.46c-1.66 1.29-2.96 3.01-3.74 4.99 1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42 2.93 2.92 1.27-1.27-17.73-17.73-1.27 1.27zm5.53 5.53l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></g>\n<g id=\"visibility\"><path d=\"M12 4.5c-5 0-9.27 3.11-11 7.5 1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"wallet-giftcard\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g>\n<g id=\"wallet-membership\"><path d=\"M20 2h-16c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h4v5l4-2 4 2v-5h4c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm0 13h-16v-2h16v2zm0-5h-16v-6h16v6z\"/></g>\n<g id=\"wallet-travel\"><path d=\"M20 6h-3v-2c0-1.11-.89-2-2-2h-6c-1.11 0-2 .89-2 2v2h-3c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-11-2h6v2h-6v-2zm11 15h-16v-2h16v2zm0-5h-16v-6h3v2h2v-2h6v2h2v-2h3v6z\"/></g>\n<g id=\"warning\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g>\n<g id=\"work\"><path d=\"M24 0v24h-24v-24h24m1-1h-26v26h26v-26z\"/><path d=\"M20 6h-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-6 0h-4v-2h4v2z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<html>\n<head>\n\n  <title>core-icons</title>\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <!-- load default set -->\n  <link rel=\"import\" href=\"core-icons.html\">\n  <!-- load the rest -->\n  <link rel=\"import\" href=\"av-icons.html\">\n  <link rel=\"import\" href=\"communication-icons.html\">\n  <link rel=\"import\" href=\"device-icons.html\">\n  <link rel=\"import\" href=\"editor-icons.html\">\n  <link rel=\"import\" href=\"hardware-icons.html\">\n  <link rel=\"import\" href=\"image-icons.html\">\n  <link rel=\"import\" href=\"maps-icons.html\">\n  <link rel=\"import\" href=\"notification-icons.html\">\n  <link rel=\"import\" href=\"social-icons.html\">\n  <style>\n    body {\n      font-family: 'Helvetica Neue', Helvetica, Arial;\n    }\n\n    h2 {\n      text-transform: capitalize;\n    }\n\n    core-icon {\n      transition: all 0.2s;\n      -webkit-transition: all 0.2s;\n    }\n\n    core-icon:hover {\n      fill: #fb8c00;\n    }\n\n    .set {\n      padding: 1em 0;\n      border-bottom: 1px solid silver;\n    }\n\n    .set:nth-of-type(4n-3) {\n      color: #656565;\n    }\n\n    .set:nth-of-type(4n-2) {\n      color: #FDD835;\n    }\n\n    .set:nth-of-type(4n-1) {\n      color: #0D904F;\n    }\n\n    .set:nth-of-type(4n) {\n      color: #3B78E7;\n    }\n\n    .container {\n      min-width: 10em;\n      padding: 1em;\n    }\n\n    .container > div {\n      color: black;\n    }\n  </style>\n</head>\n<body unresolved>\n\n  <template is=\"auto-binding\">\n    <template repeat=\"{{iconset in $.meta.metaArray}}\">\n      <h2>{{iconset.id}}</h2>\n      <h5>{{iconset.id === 'icons' ? 'The Default Set' : 'Import ' + iconset.id + '-icons.html'}}</h5>\n      <div class=\"set\" horizontal wrap justified layout>\n        <template repeat=\"{{ icon in iconset.iconNames }}\">\n          <span class=\"container\" vertical center layout>\n            <core-icon icon=\"{{ iconset.id }}:{{ icon }}\"></core-icon>\n            <div>{{ icon }}</div>\n          </span>\n        </template>\n      </div>\n    </template>\n    <core-iconset id=\"meta\"></core-iconset>\n  </template>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/device-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"device\" iconSize=\"24\">\n<svg><defs>\n<g id=\"access-alarm\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.62 4.61h-1.5v6l4.75 2.85.75-1.23-4-2.37v-5.25zm-.5-4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"access-alarms\"><path d=\"M22 5.7l-4.6-3.9-1.3 1.5 4.6 3.9 1.3-1.5zm-14.1-2.3l-1.3-1.5-4.6 3.8 1.3 1.5 4.6-3.8zm4.6 4.6h-1.5v6l4.7 2.9.8-1.2-4-2.4v-5.3zm-.5-4c-5 0-9 4-9 9s4 9 9 9 9-4 9-9-4-9-9-9zm0 16c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7z\"/></g>\n<g id=\"access-time\"><path fill-opacity=\".9\" d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path fill-opacity=\".9\" d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g>\n<g id=\"add-alarm\"><path d=\"M7.88 3.39l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm14.12 2.33l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-10-1.72c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\"/></g>\n<g id=\"airplanemode-off\"><path d=\"M13 9v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v3.68l7.83 7.83 3.17.99v-2l-8-5zm-10-3.73l4.99 4.99-5.99 3.74v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-3.73l5.73 5.73 1.27-1.27-15.73-15.73-1.27 1.27z\"/></g>\n<g id=\"airplanemode-on\"><path d=\"M10.18 9\"/><path d=\"M21 16v-2l-8-5v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z\"/></g>\n<g id=\"battery-20\"><path d=\"M7 17v3.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-3.67h-10z\"/><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v11.67h10v-11.67z\"/></g>\n<g id=\"battery-30\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v9.67h10v-9.67z\"/><path d=\"M7 15v5.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-5.67h-10z\"/></g>\n<g id=\"battery-50\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v7.67h10v-7.67z\"/><path d=\"M7 13v7.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-7.67h-10z\"/></g>\n<g id=\"battery-60\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v5.67h10v-5.67z\"/><path d=\"M7 11v9.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-9.67h-10z\"/></g>\n<g id=\"battery-80\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v3.67h10v-3.67z\"/><path d=\"M7 9v11.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-11.67h-10z\"/></g>\n<g id=\"battery-90\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v2.67h10v-2.67z\"/><path d=\"M7 8v12.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-12.67h-10z\"/></g>\n<g id=\"battery-alert\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33zm-2.67 14h-2v-2h2v2zm0-4h-2v-5h2v5z\"/></g>\n<g id=\"battery-charging-20\"><path d=\"M11 20v-3h-4v3.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-3.67h-4.4l-1.6 3z\"/><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v11.67h4v-2.5h-2l4-7.5v5.5h2l-2.4 4.5h4.4v-11.67c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-charging-30\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v9.17h2l4-7.5v5.5h2l-1.07 2h3.07v-9.17c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M11 20v-5.5h-4v6.17c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-6.17h-3.07l-2.93 5.5z\"/></g>\n<g id=\"battery-charging-50\"><path d=\"M14.47 13.5l-3.47 6.5v-5.5h-2l.53-1h-2.53v7.17c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-7.17h-2.53z\"/><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v8.17h2.53l3.47-6.5v5.5h2l-.53 1h2.53v-8.17c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-charging-60\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v5.67h3.87l2.13-4v4h4v-5.67c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M13 12.5h2l-4 7.5v-5.5h-2l1.87-3.5h-3.87v9.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-9.67h-4v1.5z\"/></g>\n<g id=\"battery-charging-80\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v3.67h4.93l1.07-2v2h4v-3.67c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M13 12.5h2l-4 7.5v-5.5h-2l2.93-5.5h-4.93v11.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-11.67h-4v3.5z\"/></g>\n<g id=\"battery-charging-90\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v2.67h5.47l.53-1v1h4v-2.67c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M13 12.5h2l-4 7.5v-5.5h-2l3.47-6.5h-5.47v12.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-12.67h-4v4.5z\"/></g>\n<g id=\"battery-charging-full\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33zm-4.67 16v-5.5h-2l4-7.5v5.5h2l-4 7.5z\"/></g>\n<g id=\"battery-full\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-std\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-unknown\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33zm-2.72 13.95h-1.9v-1.9h1.9v1.9zm1.35-5.26s-.38.42-.67.71c-.48.48-.83 1.15-.83 1.6h-1.6c0-.83.46-1.52.93-2l.93-.94c.27-.27.44-.65.44-1.06 0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5h-1.5c0-1.66 1.34-3 3-3s3 1.34 3 3c0 .66-.27 1.26-.7 1.69z\"/></g>\n<g id=\"bluetooth\"><path d=\"M17.71 7.71l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"bluetooth-connected\"><path d=\"M7 12l-2-2-2 2 2 2 2-2zm10.71-4.29l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88zm4.12-6.29l-2 2 2 2 2-2-2-2z\"/></g>\n<g id=\"bluetooth-disabled\"><path d=\"M13 5.83l1.88 1.88-1.6 1.6 1.41 1.41 3.02-3.02-5.71-5.7h-1v5.03l2 2v-3.2zm-7.59-1.83l-1.41 1.41 6.59 6.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l4.29-4.29 2.3 2.29 1.41-1.41-14.59-14.59zm7.59 14.17v-3.76l1.88 1.88-1.88 1.88z\"/></g>\n<g id=\"bluetooth-searching\"><path d=\"M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"brightness-auto\"><path d=\"M10.85 12.65h2.3l-1.15-3.65-1.15 3.65zm9.15-3.96v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-5.7 7.31l-.7-2h-3.2l-.7 2h-1.9l3.2-9h2l3.2 9h-1.9z\"/></g>\n<g id=\"brightness-high\"><path d=\"M20 8.69v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-8 9.31c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z\"/></g>\n<g id=\"brightness-low\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z\"/></g>\n<g id=\"brightness-medium\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69v-12c3.31 0 6 2.69 6 6s-2.69 6-6 6z\"/></g>\n<g id=\"data-usage\"><path d=\"M13 2.05v3.03c3.39.49 6 3.39 6 6.92 0 .9-.18 1.75-.48 2.54l2.6 1.53c.56-1.24.88-2.62.88-4.07 0-5.18-3.95-9.45-9-9.95zm-1 16.95c-3.87 0-7-3.13-7-7 0-3.53 2.61-6.43 6-6.92v-3.03c-5.06.5-9 4.76-9 9.95 0 5.52 4.47 10 9.99 10 3.31 0 6.24-1.61 8.06-4.09l-2.6-1.53c-1.28 1.6-3.24 2.62-5.45 2.62z\"/></g>\n<g id=\"developer-mode\"><path d=\"M7 5h10v2h2v-4c0-1.1-.9-1.99-2-1.99l-10-.01c-1.1 0-2 .9-2 2v4h2v-2zm8.41 11.59l4.59-4.59-4.59-4.59-1.41 1.42 3.17 3.17-3.17 3.17 1.41 1.42zm-5.41-1.42l-3.17-3.17 3.17-3.17-1.41-1.42-4.59 4.59 4.59 4.59 1.41-1.42zm7 3.83h-10v-2h-2v4c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-4h-2v2z\"/></g>\n<g id=\"devices\"><path d=\"M4 6h18v-2h-18c-1.1 0-2 .9-2 2v11h-2v3h14v-3h-10v-11zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-10c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z\"/></g>\n<g id=\"dvr\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2l.01-12c0-1.1-.9-2-2-2zm0 14h-18v-12h18v12zm-2-9h-11v2h11v-2zm0 4h-11v2h11v-2zm-12-4h-2v2h2v-2zm0 4h-2v2h2v-2z\"/></g>\n<g id=\"gps-fixed\"><path d=\"M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"gps-not-fixed\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"gps-off\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5c.82-.34 1.72-.53 2.66-.53 3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15h2.05v-2h-2.06zm-17.94-6.73l2.04 2.04c-1.07 1.31-1.79 2.92-1.98 4.69h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c1.77-.2 3.38-.91 4.69-1.98l2.04 2.04 1.27-1.27-16.73-16.73-1.27 1.27zm13.27 13.27c-1.18.91-2.66 1.46-4.27 1.46-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z\"/></g>\n<g id=\"location-disabled\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5c.82-.34 1.72-.53 2.66-.53 3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15h2.05v-2h-2.06zm-17.94-6.73l2.04 2.04c-1.07 1.31-1.79 2.92-1.98 4.69h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c1.77-.2 3.38-.91 4.69-1.98l2.04 2.04 1.27-1.27-16.73-16.73-1.27 1.27zm13.27 13.27c-1.18.91-2.66 1.46-4.27 1.46-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z\"/></g>\n<g id=\"location-searching\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"multitrack-audio\"><path d=\"M7 18h2v-12h-2v12zm4 4h2v-20h-2v20zm-8-8h2v-4h-2v4zm12 4h2v-12h-2v12zm4-8v4h2v-4h-2z\"/></g>\n<g id=\"network-cell\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M17 7l-15 15h15z\"/></g>\n<g id=\"network-wifi\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54c-.43-.33-3.66-2.95-8.47-2.95-4.81 0-8.04 2.62-8.47 2.95z\"/></g>\n<g id=\"nfc\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm0 18h-16v-16h16v16zm-2-14h-5c-1.1 0-2 .9-2 2v2.28c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72v-2.28h3v8h-8v-8h2v-2h-4v12h12v-12z\"/></g>\n<g id=\"now-wallpaper\"><path d=\"M4 4h7v-2h-7c-1.1 0-2 .9-2 2v7h2v-7zm6 9l-4 5h12l-3-4-2.03 2.71-2.97-3.71zm7-4.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5.67 1.5 1.5 1.5 1.5-.67 1.5-1.5zm3-6.5h-7v2h7v7h2v-7c0-1.1-.9-2-2-2zm0 18h-7v2h7c1.1 0 2-.9 2-2v-7h-2v7zm-16-7h-2v7c0 1.1.9 2 2 2h7v-2h-7v-7z\"/></g>\n<g id=\"now-widgets\"><path d=\"M13 13v8h8v-8h-8zm-10 8h8v-8h-8v8zm0-18v8h8v-8h-8zm13.66-1.31l-5.66 5.65 5.66 5.66 5.66-5.66-5.66-5.65z\"/></g>\n<g id=\"screen-lock-landscape\"><path d=\"M21 5h-18c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-2 12h-14v-10h14v10zm-9-1h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1z\"/></g>\n<g id=\"screen-lock-portrait\"><path d=\"M10 16h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1zm6.2-9h-10c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-2-2-2zm0 18h-10v-14h10v14z\"/></g>\n<g id=\"screen-lock-rotation\"><path d=\"M23.25 12.77l-2.57-2.57-1.41 1.41 2.22 2.22-5.66 5.66-11.32-11.32 5.66-5.66 2.1 2.1 1.41-1.41-2.45-2.45c-.59-.59-1.54-.59-2.12 0l-6.36 6.36c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12zm-14.78 7.71c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.82-1.33 1.33zm7.53-11.48h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1v-.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1zm.8-6.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7v.5h-3.4v-.5z\"/></g>\n<g id=\"screen-rotation\"><path d=\"M16.48 2.52c3.27 1.55 5.61 4.72 5.97 8.48h1.5c-.51-6.16-5.66-11-11.95-11l-.66.03 3.81 3.81 1.33-1.32zm-6.25-.77c-.59-.59-1.54-.59-2.12 0l-6.36 6.36c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12l-12.02-12.02zm4.6 19.44l-12.02-12.02 6.36-6.36 12.02 12.02-6.36 6.36zm-7.31.29c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.81-1.33 1.32z\"/></g>\n<g id=\"sd-storage\"><path d=\"M18 2h-8l-5.98 6-.02 12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-6 6h-2v-4h2v4zm3 0h-2v-4h2v4zm3 0h-2v-4h2v4z\"/></g>\n<g id=\"settings-system-daydream\"><path d=\"M9 16h6.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5h-.05c-.24-1.69-1.69-3-3.45-3-1.4 0-2.6.83-3.16 2.02h-.16c-1.51.16-2.68 1.43-2.68 2.98 0 1.66 1.34 3 3 3zm12-13h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"signal-cellular-0-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/></g>\n<g id=\"signal-cellular-1-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M12 12l-10 10h10z\"/></g>\n<g id=\"signal-cellular-2-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M14 10l-12 12h12z\"/></g>\n<g id=\"signal-cellular-3-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M17 7l-15 15h15z\"/></g>\n<g id=\"signal-cellular-4-bar\"><path d=\"M2 22h20v-20z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-0-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M20 22h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-1-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M20 10v8h2v-8h-2zm-8 12v-10l-10 10h10zm8 0h2v-2h-2v2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-2-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M14 22v-12l-12 12h12zm6-12v8h2v-8h-2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-3-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M17 22v-15l-15 15h15zm3-12v8h2v-8h-2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-4-bar\"><path d=\"M20 18h2v-8h-2v8zm0 4h2v-2h-2v2zm-18 0h16v-14h4v-6l-20 20z\"/></g>\n<g id=\"signal-cellular-no-sim\"><path d=\"M18.99 5c0-1.1-.89-2-1.99-2h-7l-2.34 2.34 11.34 11.34-.01-11.68zm-15.34-1.12l-1.27 1.27 2.62 2.62v11.23c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27-17.47-17.47z\"/></g>\n<g id=\"signal-cellular-null\"><path d=\"M20 6.83v13.17h-13.17l13.17-13.17m2-4.83l-20 20h20v-20z\"/></g>\n<g id=\"signal-cellular-off\"><path d=\"M21 1l-8.59 8.59 8.59 8.59v-17.18zm-16.23 3.5l-1.27 1.27 6.36 6.36-8.86 8.87h17.73l2 2 1.27-1.27-17.23-17.23z\"/></g>\n<g id=\"signal-wifi-0-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/></g>\n<g id=\"signal-wifi-1-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M6.67 14.86l5.33 6.63v.01l.01-.01 5.33-6.63c-.28-.21-2.31-1.86-5.34-1.86s-5.06 1.65-5.33 1.86z\"/></g>\n<g id=\"signal-wifi-2-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M4.79 12.52l7.2 8.98h.01l.01-.01 7.2-8.98c-.36-.27-3.11-2.51-7.21-2.51s-6.85 2.24-7.21 2.52z\"/></g>\n<g id=\"signal-wifi-3-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54c-.43-.33-3.66-2.95-8.47-2.95-4.81 0-8.04 2.62-8.47 2.95z\"/></g>\n<g id=\"signal-wifi-4-bar\"><path d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/></g>\n<g id=\"signal-wifi-off\"><path d=\"M23.64 7c-.45-.34-4.93-4-11.64-4-1.5 0-2.89.19-4.15.48l10.33 10.32 5.46-6.8zm-6.6 8.22l-13.77-13.78-1.27 1.28 2.05 2.06c-2.14.98-3.46 2.04-3.69 2.22l11.63 14.49.01.01.01-.01 3.9-4.86 3.32 3.32 1.27-1.27-3.46-3.46z\"/></g>\n<g id=\"signal-wifi-statusbar-1-bar\"><path d=\"M13 21.99l5.66-7.05c-.22-.16-2.39-1.94-5.66-1.94s-5.44 1.78-5.66 1.95l5.66 7.04z\"/><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/></g>\n<g id=\"signal-wifi-statusbar-2-bar\"><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/><path d=\"M13.01 21.99l7.54-9.4c-.29-.21-3.19-2.59-7.55-2.59-4.36 0-7.26 2.38-7.55 2.59l7.54 9.4h.02z\"/></g>\n<g id=\"signal-wifi-statusbar-3-bar\"><path d=\"M13.01 21.99l9.43-11.75c-.37-.27-4-3.24-9.44-3.24-5.44 0-9.07 2.97-9.44 3.24l9.43 11.75h.02z\"/><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/></g>\n<g id=\"signal-wifi-statusbar-4-bar\"><path d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-1\"><path fill-opacity=\".3\" d=\"M24.24 8l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24z\"/><path d=\"M7.34 14.95l5.66 7.04v.01-.01l5.66-7.05c-.22-.16-2.39-1.94-5.66-1.94s-5.44 1.78-5.66 1.95zm14.66 7.05h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-2\"><path fill-opacity=\".3\" d=\"M24.24 8l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24z\"/><path d=\"M5.45 12.59l7.54 9.4.01.01.01-.01 6.99-8.71v-1.09c-1.07-.73-3.59-2.19-7-2.19-4.36 0-7.26 2.38-7.55 2.59zm16.55-2.59v8h2v-8h-2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet\"><path fill-opacity=\".3\" d=\"M24.24 8l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24z\"/><path d=\"M22 22h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-3\"><path d=\"M13.01 21.99l9.43-11.75c-.37-.27-4-3.24-9.44-3.24-5.44 0-9.07 2.97-9.44 3.24l9.43 11.75h.02z\"/><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/><path d=\"M20 16.27v-8.27h6.64\"/><path d=\"M22 22h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-4\"><path d=\"M22 22h2v-2h-2v2zm-9-20c-7.26 0-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32zm9 16h2v-8h-2v8z\"/></g>\n<g id=\"signal-wifi-statusbar-not-connected\"><path fill-opacity=\".3\" d=\"M21 8.5c.85 0 1.64.23 2.34.62l2.24-2.79c-.48-.37-5.32-4.33-12.58-4.33s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 4.21-5.24c-.76-.87-1.22-2-1.22-3.25 0-2.76 2.24-5 5-5z\"/><path d=\"M21 10c-1.93 0-3.5 1.57-3.5 3.5h1.75c0-.97.78-1.75 1.75-1.75s1.75.78 1.75 1.75c0 .48-.2.92-.51 1.24l-1.09 1.1c-.63.63-1.02 1.51-1.02 2.47v.44h1.75c0-1.31.39-1.84 1.03-2.47l.78-.8c.5-.5.82-1.2.82-1.97-.01-1.94-1.58-3.51-3.51-3.51zm-.95 11.95h1.9v-1.9h-1.9v1.9z\"/></g>\n<g id=\"signal-wifi-statusbar-null\"><path d=\"M13 4c4.25 0 7.62 1.51 9.68 2.75l-9.68 12.05-9.67-12.05c2.05-1.24 5.42-2.75 9.67-2.75m0-2c-7.26 0-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32z\"/></g>\n<g id=\"storage\"><path d=\"M2 20h20v-4h-20v4zm2-3h2v2h-2v-2zm-2-13v4h20v-4h-20zm4 3h-2v-2h2v2zm-4 7h20v-4h-20v4zm2-3h2v2h-2v-2z\"/></g>\n<g id=\"tv-guide\"><path d=\"M19 3h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-3 13h-2l-2.25-6h-1.75v6h-2v-6h-3v-2h8.5l1.5 4.5 1.5-4.5h2.5l-3 8z\"/></g>\n<g id=\"tv-options-edit-channels\"><path d=\"M1 16h2v-2h-2v2zm17-10h-13v2h13v-2zm-17 6h2v-2h-2v2zm17-2h-13v2h13v-2zm4.59-.41l-7.59 7.58-3.59-3.59-1.41 1.42 5 5 9-9-1.41-1.41zm-21.59-1.59h2v-2h-2v2zm4 8h4v-2h-4v2z\"/></g>\n<g id=\"tv-options-input-settings\"><path d=\"M7.17 13.63l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.01.13.12.22.24.22h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.06-.83c.02-.16.04-.32.04-.49s-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.84-.49l-.19-1.32c-.03-.12-.14-.21-.26-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49s.01.33.04.49l-1.06.83c-.1.07-.12.21-.06.31zm4.83-3.63c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9-7h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"tv-options-parental\"><path d=\"M16.5 12c1.38 0 2.49-1.12 2.49-2.5s-1.11-2.5-2.49-2.5c-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5zm-7.5-1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75v2.25h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zm-7.5-1c-2.33 0-7 1.17-7 3.5v2.5h7v-2.25c0-.85.33-2.34 2.37-3.47-.87-.18-1.71-.28-2.37-.28z\"/></g>\n<g id=\"usb\"><path d=\"M15 7v4h1v2h-3v-8h2l-3-4-3 4h2v8h-3v-2.07c.7-.37 1.2-1.08 1.2-1.93 0-1.21-.99-2.2-2.2-2.2-1.21 0-2.2.99-2.2 2.2 0 .85.5 1.56 1.2 1.93v2.07c0 1.11.89 2 2 2h3v3.05c-.71.37-1.2 1.1-1.2 1.95 0 1.22.99 2.2 2.2 2.2 1.21 0 2.2-.98 2.2-2.2 0-.85-.49-1.58-1.2-1.95v-3.05h3c1.11 0 2-.89 2-2v-2h1v-4h-4z\"/></g>\n<g id=\"wifi-lock\"><path d=\"M20.5 9.5c.28 0 .55.04.81.08l2.69-3.58c-3.34-2.51-7.5-4-12-4s-8.66 1.49-12 4l12 16 3.5-4.67v-2.83c0-2.76 2.24-5 5-5zm2.5 6.5v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v1.5z\"/></g>\n<g id=\"wifi-tethering\"><path d=\"M12 11c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 2c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19zm-6-10c-5.52 0-10 4.48-10 10 0 3.7 2.01 6.92 4.99 8.65l1-1.73c-2.38-1.39-3.99-3.96-3.99-6.92 0-4.42 3.58-8 8-8s8 3.58 8 8c0 2.96-1.61 5.53-4 6.92l1 1.73c2.99-1.73 5-4.95 5-8.65 0-5.52-4.48-10-10-10z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/editor-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"editor\" iconSize=\"24\">\n<svg><defs>\n<g id=\"attach-file\"><path d=\"M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4v-12.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1v-9.5h-1.5v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5v-10.5c0-2.21-1.79-4-4-4s-4 1.79-4 4v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5v-11.5h-1.5z\"/></g>\n<g id=\"attach-money\"><path d=\"M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81v-2.19h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83v2.17h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z\"/></g>\n<g id=\"border-all\"><path d=\"M3 3v18h18v-18h-18zm8 16h-6v-6h6v6zm0-8h-6v-6h6v6zm8 8h-6v-6h6v6zm0-8h-6v-6h6v6z\"/></g>\n<g id=\"border-bottom\"><path d=\"M9 11h-2v2h2v-2zm4 4h-2v2h2v-2zm-4-12h-2v2h2v-2zm4 8h-2v2h2v-2zm-8-8h-2v2h2v-2zm8 4h-2v2h2v-2zm4 4h-2v2h2v-2zm-4-8h-2v2h2v-2zm4 0h-2v2h2v-2zm2 10h2v-2h-2v2zm0 4h2v-2h-2v2zm-14-10h-2v2h2v-2zm14-4v2h2v-2h-2zm0 6h2v-2h-2v2zm-14 2h-2v2h2v-2zm-2 10h18v-2h-18v2zm2-6h-2v2h2v-2z\"/></g>\n<g id=\"border-clear\"><path d=\"M7 5h2v-2h-2v2zm0 8h2v-2h-2v2zm0 8h2v-2h-2v2zm4-4h2v-2h-2v2zm0 4h2v-2h-2v2zm-8 0h2v-2h-2v2zm0-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0-4h2v-2h-2v2zm8 8h2v-2h-2v2zm8 4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8h2v-2h-2v2zm0-12h2v-2h-2v2zm-8 0h2v-2h-2v2zm8-6v2h2v-2h-2zm-8 2h2v-2h-2v2zm4 16h2v-2h-2v2zm0-8h2v-2h-2v2zm0-8h2v-2h-2v2z\"/></g>\n<g id=\"border-color\"><path d=\"M17.75 7l-3.75-3.75-10 10v3.75h3.75l10-10zm2.96-2.96c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.96 1.96 3.75 3.75 1.96-1.96z\"/><path fill-opacity=\".36\" d=\"M0 20h24v4h-24z\"/></g>\n<g id=\"border-horizontal\"><path d=\"M3 21h2v-2h-2v2zm2-14h-2v2h2v-2zm-2 10h2v-2h-2v2zm4 4h2v-2h-2v2zm-2-18h-2v2h2v-2zm4 0h-2v2h2v-2zm8 0h-2v2h2v-2zm-4 4h-2v2h2v-2zm0-4h-2v2h2v-2zm6 14h2v-2h-2v2zm-8 4h2v-2h-2v2zm-8-8h18v-2h-18v2zm16-10v2h2v-2h-2zm0 6h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 4h2v-2h-2v2zm4 0h2v-2h-2v2z\"/></g>\n<g id=\"border-inner\"><path d=\"M3 21h2v-2h-2v2zm4 0h2v-2h-2v2zm-2-14h-2v2h2v-2zm-2 10h2v-2h-2v2zm6-14h-2v2h2v-2zm-4 0h-2v2h2v-2zm12 0h-2v2h2v-2zm2 6h2v-2h-2v2zm0-6v2h2v-2h-2zm-4 18h2v-2h-2v2zm-2-18h-2v8h-8v2h8v8h2v-8h8v-2h-8v-8zm6 18h2v-2h-2v2zm0-4h2v-2h-2v2z\"/></g>\n<g id=\"border-left\"><path d=\"M11 21h2v-2h-2v2zm0-4h2v-2h-2v2zm0-12h2v-2h-2v2zm0 4h2v-2h-2v2zm0 4h2v-2h-2v2zm-4 8h2v-2h-2v2zm0-16h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 8h2v-18h-2v18zm16-12h2v-2h-2v2zm-4 12h2v-2h-2v2zm4-4h2v-2h-2v2zm0-14v2h2v-2h-2zm0 10h2v-2h-2v2zm0 8h2v-2h-2v2zm-4-8h2v-2h-2v2zm0-8h2v-2h-2v2z\"/></g>\n<g id=\"border-outer\"><path d=\"M13 7h-2v2h2v-2zm0 4h-2v2h2v-2zm4 0h-2v2h2v-2zm-14-8v18h18v-18h-18zm16 16h-14v-14h14v14zm-6-4h-2v2h2v-2zm-4-4h-2v2h2v-2z\"/></g>\n<g id=\"border-right\"><path d=\"M7 21h2v-2h-2v2zm-4-16h2v-2h-2v2zm4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 8h2v-2h-2v2zm8 0h2v-2h-2v2zm-8-8h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm8 8h2v-2h-2v2zm4-4h2v-2h-2v2zm4-10v18h2v-18h-2zm-4 18h2v-2h-2v2zm0-16h2v-2h-2v2zm-4 8h2v-2h-2v2zm0-8h2v-2h-2v2zm0 4h2v-2h-2v2z\"/></g>\n<g id=\"border-style\"><path d=\"M15 21h2v-2h-2v2zm4 0h2v-2h-2v2zm-12 0h2v-2h-2v2zm4 0h2v-2h-2v2zm8-4h2v-2h-2v2zm0-4h2v-2h-2v2zm-16-10v18h2v-16h16v-2h-18zm16 6h2v-2h-2v2z\"/></g>\n<g id=\"border-top\"><path d=\"M7 21h2v-2h-2v2zm0-8h2v-2h-2v2zm4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm-8-4h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm0-4h2v-2h-2v2zm8 8h2v-2h-2v2zm8-8h2v-2h-2v2zm0 4h2v-2h-2v2zm-16-10v2h18v-2h-18zm16 14h2v-2h-2v2zm-4 4h2v-2h-2v2zm-4-12h2v-2h-2v2zm8 12h2v-2h-2v2zm-4-8h2v-2h-2v2z\"/></g>\n<g id=\"border-vertical\"><path d=\"M3 9h2v-2h-2v2zm0-4h2v-2h-2v2zm4 16h2v-2h-2v2zm0-8h2v-2h-2v2zm-4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm0-4h2v-2h-2v2zm4-12h2v-2h-2v2zm12 12h2v-2h-2v2zm-8 4h2v-18h-2v18zm8 0h2v-2h-2v2zm0-8h2v-2h-2v2zm0-10v2h2v-2h-2zm0 6h2v-2h-2v2zm-4-4h2v-2h-2v2zm0 16h2v-2h-2v2zm0-8h2v-2h-2v2z\"/></g>\n<g id=\"format-align-center\"><path d=\"M7 15v2h10v-2h-10zm-4 6h18v-2h-18v2zm0-8h18v-2h-18v2zm4-6v2h10v-2h-10zm-4-4v2h18v-2h-18z\"/></g>\n<g id=\"format-align-justify\"><path d=\"M3 21h18v-2h-18v2zm0-4h18v-2h-18v2zm0-4h18v-2h-18v2zm0-4h18v-2h-18v2zm0-6v2h18v-2h-18z\"/></g>\n<g id=\"format-align-left\"><path d=\"M15 15h-12v2h12v-2zm0-8h-12v2h12v-2zm-12 6h18v-2h-18v2zm0 8h18v-2h-18v2zm0-18v2h18v-2h-18z\"/></g>\n<g id=\"format-align-right\"><path d=\"M3 21h18v-2h-18v2zm6-4h12v-2h-12v2zm-6-4h18v-2h-18v2zm6-4h12v-2h-12v2zm-6-6v2h18v-2h-18z\"/></g>\n<g id=\"format-bold\"><path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4h-6.25v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zm-5.6-4.29h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9h-3.5v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"format-clear\"><path d=\"M3.27 5l-1.27 1.27 6.97 6.97-2.47 5.76h3l1.57-3.66 5.66 5.66 1.27-1.27-14.45-14.46-.28-.27zm2.73 0v.18l2.82 2.82h2.4l-.72 1.68 2.1 2.1 1.61-3.78h5.79v-3h-14z\"/></g>\n<g id=\"format-color-fill\"><path d=\"M16.56 8.94l-8.94-8.94-1.41 1.41 2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zm-11.35 1.06l4.79-4.79 4.79 4.79h-9.58zm13.79 1.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5z\"/><path fill-opacity=\".36\" d=\"M0 20h24v4h-24z\"/></g>\n<g id=\"format-color-reset\"><path d=\"M18 14c0-4-6-10.8-6-10.8s-1.33 1.51-2.73 3.52l8.59 8.59c.09-.42.14-.86.14-1.31zm-.88 3.12l-4.62-4.62-7.23-7.23-1.27 1.28 3.32 3.32c-.77 1.45-1.32 2.92-1.32 4.13 0 3.31 2.69 6 6 6 1.52 0 2.9-.57 3.96-1.5l2.63 2.63 1.27-1.27-2.74-2.74z\"/></g>\n<g id=\"format-color-text\"><path fill-opacity=\".36\" d=\"M0 20h24v4h-24z\"/><path d=\"M11 3l-5.5 14h2.25l1.12-3h6.25l1.12 3h2.25l-5.49-14h-2zm-1.38 9l2.38-6.33 2.38 6.33h-4.76z\"/></g>\n<g id=\"format-indent-decrease\"><path d=\"M11 17h10v-2h-10v2zm-8-5l4 4v-8l-4 4zm0 9h18v-2h-18v2zm0-18v2h18v-2h-18zm8 6h10v-2h-10v2zm0 4h10v-2h-10v2z\"/></g>\n<g id=\"format-indent-increase\"><path d=\"M3 21h18v-2h-18v2zm0-13v8l4-4-4-4zm8 9h10v-2h-10v2zm-8-14v2h18v-2h-18zm8 6h10v-2h-10v2zm0 4h10v-2h-10v2z\"/></g>\n<g id=\"format-italic\"><path d=\"M10 4v3h2.21l-3.42 8h-2.79v3h8v-3h-2.21l3.42-8h2.79v-3z\"/></g>\n<g id=\"format-line-spacing\"><path d=\"M6 7h2.5l-3.5-3.5-3.5 3.5h2.5v10h-2.5l3.5 3.5 3.5-3.5h-2.5v-10zm4-2v2h12v-2h-12zm0 14h12v-2h-12v2zm0-6h12v-2h-12v2z\"/></g>\n<g id=\"format-list-bulleted\"><path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0 12.17c-.74 0-1.33.6-1.33 1.33s.6 1.33 1.33 1.33 1.33-.6 1.33-1.33-.59-1.33-1.33-1.33zm3 2.33h14v-2h-14v2zm0-6h14v-2h-14v2zm0-8v2h14v-2h-14z\"/></g>\n<g id=\"format-list-numbered\"><path d=\"M2 17h2v.5h-1v1h1v.5h-2v1h3v-4h-3v1zm1-9h1v-4h-2v1h1v3zm-1 3h1.8l-1.8 2.1v.9h3v-1h-1.8l1.8-2.1v-.9h-3v1zm5-6v2h14v-2h-14zm0 14h14v-2h-14v2zm0-6h14v-2h-14v2z\"/></g>\n<g id=\"format-paint\"><path d=\"M18 4v-1c0-.55-.45-1-1-1h-12c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-1h1v4h-10v11c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-9h8v-8h-3z\"/></g>\n<g id=\"format-quote\"><path d=\"M6 17h3l2-4v-6h-6v6h3zm8 0h3l2-4v-6h-6v6h3z\"/></g>\n<g id=\"format-size\"><path d=\"M9 4v3h5v12h3v-12h5v-3h-13zm-6 8h3v7h3v-7h3v-3h-9v3z\"/></g>\n<g id=\"format-strikethrough\"><path d=\"M10 19h4v-3h-4v3zm-5-15v3h5v3h4v-3h5v-3h-14zm-2 10h18v-2h-18v2z\"/></g>\n<g id=\"format-textdirection-l-to-r\"><path d=\"M18 4h-12v2l6.5 6-6.5 6v2h12v-3h-7l5-5-5-5h7z\"/></g>\n<g id=\"format-textdirection-r-to-l\"><path d=\"M9 10v5h2v-11h2v11h2v-11h2v-2h-8c-2.21 0-4 1.79-4 4s1.79 4 4 4zm12 8l-4-4v3h-12v2h12v3l4-4z\"/></g>\n<g id=\"format-underline\"><path d=\"M12 17c3.31 0 6-2.69 6-6v-8h-2.5v8c0 1.93-1.57 3.5-3.5 3.5s-3.5-1.57-3.5-3.5v-8h-2.5v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2h-14z\"/></g>\n<g id=\"functions\"><path d=\"M10 10v5h2v-11h2v11h2v-11h2v-2h-8c-2.21 0-4 1.79-4 4s1.79 4 4 4zm-2 7v-3l-4 4 4 4v-3h12v-2h-12z\"/></g>\n<g id=\"insert-chart\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g>\n<g id=\"insert-comment\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4v-18c0-1.1-.9-2-2-2zm-2 12h-12v-2h12v2zm0-3h-12v-2h12v2zm0-3h-12v-2h12v2z\"/></g>\n<g id=\"insert-drive-file\"><path d=\"M6 2c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6h-8zm7 7v-5.5l5.5 5.5h-5.5z\"/></g>\n<g id=\"insert-emoticon\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5h-10.22c.8 2.04 2.78 3.5 5.11 3.5z\"/></g>\n<g id=\"insert-invitation\"><path d=\"M17 12h-5v5h5v-5zm-1-11v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-1v-2h-2zm3 18h-14v-11h14v11z\"/></g>\n<g id=\"insert-link\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4v-1.9h-4c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9h-4c-1.71 0-3.1-1.39-3.1-3.1zm4.1 1h8v-2h-8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4v1.9h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></g>\n<g id=\"insert-photo\"><path d=\"M21 19v-14c0-1.1-.9-2-2-2h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zm-12.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"merge-type\"><path d=\"M17 20.41l1.41-1.41-3.41-3.41-1.41 1.41 3.41 3.41zm-9.5-12.41h3.5v5.59l-5.41 5.41 1.41 1.41 6-6v-6.41h3.5l-4.5-4.5-4.5 4.5z\"/></g>\n<g id=\"mode-comment\"><path d=\"M21.99 4c0-1.1-.89-2-1.99-2h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z\"/></g>\n<g id=\"mode-edit\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g>\n<g id=\"publish\"><path d=\"M5 4v2h14v-2h-14zm0 10h4v6h6v-6h4l-7-7-7 7z\"/></g>\n<g id=\"vertical-align-bottom\"><path d=\"M16 13h-3v-10h-2v10h-3l4 4 4-4zm-12 6v2h16v-2h-16z\"/></g>\n<g id=\"vertical-align-center\"><path d=\"M8 19h3v4h2v-4h3l-4-4-4 4zm8-14h-3v-4h-2v4h-3l4 4 4-4zm-12 6v2h16v-2h-16z\"/></g>\n<g id=\"vertical-align-top\"><path d=\"M8 11h3v10h2v-10h3l-4-4-4 4zm-4-8v2h16v-2h-16z\"/></g>\n<g id=\"wrap-text\"><path d=\"M4 19h6v-2h-6v2zm16-14h-16v2h16v-2zm-3 6h-13v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2h-2.25v-2l-3 3 3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/hardware-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"hardware\" iconSize=\"24\">\n<svg><defs>\n<g id=\"cast\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v3h2v-3h18v14h-7v2h7c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-20 15v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11z\"/></g>\n<g id=\"cast-connected\"><path d=\"M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm18-7h-14v1.63c3.96 1.28 7.09 4.41 8.37 8.37h5.63v-10zm-18 3v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7h-18c-1.1 0-2 .9-2 2v3h2v-3h18v14h-7v2h7c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"chromecast\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 2c2.96 0 5.54 1.61 6.92 4h-6.92c-1.94 0-3.55 1.38-3.92 3.21l-2.38-4.13c1.46-1.87 3.74-3.08 6.3-3.08zm3 8c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-11 0c0-1.46.4-2.82 1.08-3.99l3.46 6 .01-.01c.69 1.19 1.97 2 3.45 2 .45 0 .88-.09 1.29-.23l-2.39 4.15c-3.9-.54-6.9-3.88-6.9-7.92zm8 8l3.46-6-.02-.01c.35-.59.56-1.26.56-1.99 0-1.2-.54-2.27-1.38-3h4.79c.38.93.59 1.94.59 3 0 4.42-3.58 8-8 8z\"/></g>\n<g id=\"computer\"><path d=\"M20 18c1.1 0 1.99-.9 1.99-2l.01-10c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h-4v2h24v-2h-4zm-16-12h16v10h-16v-10z\"/></g>\n<g id=\"desktop-mac\"><path d=\"M21 2h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7l-2 3v1h8v-1l-2-3h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 12h-18v-10h18v10z\"/></g>\n<g id=\"desktop-windows\"><path d=\"M21 2h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v2h-2v2h8v-2h-2v-2h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-18v-12h18v12z\"/></g>\n<g id=\"dock\"><path d=\"M8 23h8v-2h-8v2zm8-21.99l-8-.01c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-14c0-1.1-.9-1.99-2-1.99zm0 13.99h-8v-10h8v10z\"/></g>\n<g id=\"gamepad\"><path d=\"M15 7.5v-5.5h-6v5.5l3 3 3-3zm-7.5 1.5h-5.5v6h5.5l3-3-3-3zm1.5 7.5v5.5h6v-5.5l-3-3-3 3zm7.5-7.5l-3 3 3 3h5.5v-6h-5.5z\"/></g>\n<g id=\"headset\"><path d=\"M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8h-4v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h3c1.66 0 3-1.34 3-3v-7c0-4.97-4.03-9-9-9z\"/></g>\n<g id=\"headset-mic\"><path d=\"M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8h-4v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h4v1h-7v2h6c1.66 0 3-1.34 3-3v-10c0-4.97-4.03-9-9-9z\"/></g>\n<g id=\"keyboard\"><path d=\"M20 5h-16c-1.1 0-1.99.9-1.99 2l-.01 10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-9 3h2v2h-2v-2zm0 3h2v2h-2v-2zm-3-3h2v2h-2v-2zm0 3h2v2h-2v-2zm-1 2h-2v-2h2v2zm0-3h-2v-2h2v2zm9 7h-8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2v-2h2v2zm3 3h-2v-2h2v2zm0-3h-2v-2h2v2z\"/></g>\n<g id=\"keyboard-alt\"><path d=\"M15.5 10c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 7c2.61 0 4.83-1.67 5.65-4h-11.3c.82 2.33 3.04 4 5.65 4zm-.01-16c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"keyboard-arrow-down\"><path d=\"M7.41 7.84l4.59 4.58 4.59-4.58 1.41 1.41-6 6-6-6z\"/></g>\n<g id=\"keyboard-arrow-left\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59-1.41-1.41-6 6 6 6z\"/></g>\n<g id=\"keyboard-arrow-right\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59 1.41-1.41 6 6-6 6z\"/></g>\n<g id=\"keyboard-arrow-up\"><path d=\"M7.41 15.41l4.59-4.58 4.59 4.58 1.41-1.41-6-6-6 6z\"/></g>\n<g id=\"keyboard-backspace\"><path d=\"M21 11h-14.17l3.58-3.59-1.41-1.41-6 6 6 6 1.41-1.41-3.58-3.59h14.17z\"/></g>\n<g id=\"keyboard-capslock\"><path d=\"M12 8.41l4.59 4.59 1.41-1.41-6-6-6 6 1.41 1.41 4.59-4.59zm-6 9.59h12v-2h-12v2z\"/></g>\n<g id=\"keyboard-control\"><path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"keyboard-hide\"><path d=\"M20 3h-16c-1.1 0-1.99.9-1.99 2l-.01 10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-9 3h2v2h-2v-2zm0 3h2v2h-2v-2zm-3-3h2v2h-2v-2zm0 3h2v2h-2v-2zm-1 2h-2v-2h2v2zm0-3h-2v-2h2v2zm9 7h-8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2v-2h2v2zm3 3h-2v-2h2v2zm0-3h-2v-2h2v2zm-7 15l4-4h-8l4 4z\"/></g>\n<g id=\"keyboard-return\"><path d=\"M19 7v4h-13.17l3.58-3.59-1.41-1.41-6 6 6 6 1.41-1.41-3.58-3.59h15.17v-6z\"/></g>\n<g id=\"keyboard-tab\"><path d=\"M11.59 7.41l3.58 3.59h-14.17v2h14.17l-3.59 3.59 1.42 1.41 6-6-6-6-1.41 1.41zm8.41-1.41v12h2v-12h-2z\"/></g>\n<g id=\"keyboard-voice\"><path d=\"M12 15c1.66 0 2.99-1.34 2.99-3l.01-6c0-1.66-1.34-3-3-3s-3 1.34-3 3v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1s-5.3-2.1-5.3-5.1h-1.7c0 3.42 2.72 6.23 6 6.72v3.28h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"/></g>\n<g id=\"laptop\"><path d=\"M20 18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h-4v2h24v-2h-4zm-16-12h16v10h-16v-10z\"/></g>\n<g id=\"laptop-chromebook\"><path d=\"M22 18v-15h-20v15h-2v2h24v-2h-2zm-8 0h-4v-1h4v1zm6-3h-16v-10h16v10z\"/></g>\n<g id=\"laptop-mac\"><path d=\"M20 18c1.1 0 1.99-.9 1.99-2l.01-11c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2h-4c0 1.1.9 2 2 2h20c1.1 0 2-.9 2-2h-4zm-16-13h16v11h-16v-11zm8 14c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"laptop-windows\"><path d=\"M20 18v-1c1.1 0 1.99-.9 1.99-2l.01-10c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2v1h-4v2h24v-2h-4zm-16-13h16v10h-16v-10z\"/></g>\n<g id=\"memory\"><path d=\"M15 9h-6v6h6v-6zm-2 4h-2v-2h2v2zm8-2v-2h-2v-2c0-1.1-.9-2-2-2h-2v-2h-2v2h-2v-2h-2v2h-2c-1.1 0-2 .9-2 2v2h-2v2h2v2h-2v2h2v2c0 1.1.9 2 2 2h2v2h2v-2h2v2h2v-2h2c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2zm-4 6h-10v-10h10v10z\"/></g>\n<g id=\"mouse\"><path d=\"M13 1.07v7.93h7c0-4.08-3.05-7.44-7-7.93zm-9 13.93c0 4.42 3.58 8 8 8s8-3.58 8-8v-4h-16v4zm7-13.93c-3.95.49-7 3.85-7 7.93h7v-7.93z\"/></g>\n<g id=\"phone-android\"><path d=\"M16 1h-8c-1.66 0-3 1.34-3 3v16c0 1.66 1.34 3 3 3h8c1.66 0 3-1.34 3-3v-16c0-1.66-1.34-3-3-3zm-2 20h-4v-1h4v1zm3.25-3h-10.5v-14h10.5v14z\"/></g>\n<g id=\"phone-iphone\"><path d=\"M15.5 1h-8c-1.38 0-2.5 1.12-2.5 2.5v17c0 1.38 1.12 2.5 2.5 2.5h8c1.38 0 2.5-1.12 2.5-2.5v-17c0-1.38-1.12-2.5-2.5-2.5zm-4 21c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5-4h-9v-14h9v14z\"/></g>\n<g id=\"phonelink\"><path d=\"M4 6h18v-2h-18c-1.1 0-2 .9-2 2v11h-2v3h14v-3h-10v-11zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-10c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z\"/></g>\n<g id=\"phonelink-off\"><path d=\"M22 6v-2h-15.18l2 2h13.18zm-20.08-4.35l-1.27 1.27 1.82 1.82c-.29.34-.47.78-.47 1.26v11h-2v3h17.73l2.35 2.35 1.27-1.27-17.46-17.46-1.97-1.97zm2.08 4.62l10.73 10.73h-10.73v-10.73zm19 1.73h-6c-.55 0-1 .45-1 1v4.18l2 2v-5.18h4v7h-2.18l3 3h.18c.55 0 1-.45 1-1v-10c0-.55-.45-1-1-1z\"/></g>\n<g id=\"security\"><path d=\"M12 1l-9 4v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12v-6l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94v-8.93h-7v-5.7l7-3.11v8.8z\"/></g>\n<g id=\"sim-card\"><path d=\"M19.99 4c0-1.1-.89-2-1.99-2h-8l-6 6v12c0 1.1.9 2 2 2h12.01c1.1 0 1.99-.9 1.99-2l-.01-16zm-10.99 15h-2v-2h2v2zm8 0h-2v-2h2v2zm-8-4h-2v-4h2v4zm4 4h-2v-4h2v4zm0-6h-2v-2h2v2zm4 2h-2v-4h2v4z\"/></g>\n<g id=\"smartphone\"><path d=\"M17 1.01l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"speaker\"><path d=\"M17 2h-10c-1.1 0-2 .9-2 2v16c0 1.1.9 1.99 2 1.99l10 .01c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-5 2c1.1 0 2 .9 2 2s-.9 2-2 2c-1.11 0-2-.9-2-2s.89-2 2-2zm0 16c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"tablet\"><path d=\"M21 4h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 1.99-.9 1.99-2l.01-12c0-1.1-.9-2-2-2zm-2 14h-14v-12h14v12z\"/></g>\n<g id=\"tablet-android\"><path d=\"M18 0h-12c-1.66 0-3 1.34-3 3v18c0 1.66 1.34 3 3 3h12c1.66 0 3-1.34 3-3v-18c0-1.66-1.34-3-3-3zm-4 22h-4v-1h4v1zm5.25-3h-14.5v-16h14.5v16z\"/></g>\n<g id=\"tablet-mac\"><path d=\"M18.5 0h-14c-1.38 0-2.5 1.12-2.5 2.5v19c0 1.38 1.12 2.5 2.5 2.5h14c1.38 0 2.5-1.12 2.5-2.5v-19c0-1.38-1.12-2.5-2.5-2.5zm-7 23c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7.5-4h-15v-16h15v16z\"/></g>\n<g id=\"tv\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2l.01-12c0-1.1-.9-2-2-2zm0 14h-18v-12h18v12z\"/></g>\n<g id=\"watch\"><path d=\"M20 12c0-2.54-1.19-4.81-3.04-6.27l-.96-5.73h-8l-.95 5.73c-1.86 1.46-3.05 3.72-3.05 6.27s1.19 4.81 3.05 6.27l.95 5.73h8l.96-5.73c1.85-1.46 3.04-3.73 3.04-6.27zm-14 0c0-3.31 2.69-6 6-6s6 2.69 6 6-2.69 6-6 6-6-2.69-6-6z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/image-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"image\" iconSize=\"24\">\n<svg><defs>\n<g id=\"add-to-photos\"><path d=\"M4 6h-2v14c0 1.1.9 2 2 2h14v-2h-14v-14zm16-4h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g>\n<g id=\"adjust\"><path d=\"M12 2c-5.51 0-10 4.49-10 10s4.49 10 10 10 10-4.49 10-10-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3-8c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3z\"/></g>\n<g id=\"assistant-photo\"><path d=\"M14.4 6l-.4-2h-9v17h2v-7h5.6l.4 2h7v-10z\"/></g>\n<g id=\"audiotrack\"><path d=\"M12 3v9.28c-.47-.17-.97-.28-1.5-.28-2.49 0-4.5 2.01-4.5 4.5s2.01 4.5 4.5 4.5c2.31 0 4.2-1.75 4.45-4h.05v-11h4v-3h-7z\"/></g>\n<g id=\"blur-circular\"><path d=\"M10 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-3-3c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3-6c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm4 1.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-1.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm3 6c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-4c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-5-7.5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm2-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z\"/></g>\n<g id=\"blur-linear\"><path d=\"M5 17.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm4-4.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-6 12h18v-2h-18v2zm2-11.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm0 4c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm4 3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8-.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-14-13.5v2h18v-2h-18zm14 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm0 4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-4-3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1z\"/></g>\n<g id=\"blur-off\"><path d=\"M14 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-.2 4.48l.2.02c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5l.02.2c.09.67.61 1.19 1.28 1.28zm.2-7.98c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-4 0c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm11 7c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-11-3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8 8c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-4 13.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-11.5-15.23l3.78 3.78-.28-.05c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l2.81 2.81c-.71.11-1.25.73-1.25 1.47 0 .83.67 1.5 1.5 1.5.74 0 1.36-.54 1.47-1.25l2.81 2.81c-.09-.03-.18-.06-.28-.06-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l3.78 3.78 1.28-1.27-16.23-16.23-1.27 1.27zm7.5 11.73c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm11-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-15-.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 11c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-4-3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z\"/></g>\n<g id=\"blur-on\"><path d=\"M6 13c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3 .5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3-4.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm15 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-7-3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-3.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-11 10c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-17c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm0 3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 5.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm8 .5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm3 8.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-7 3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-4-12c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0 8.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm4-4.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-4c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"/></g>\n<g id=\"brightness-1\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></g>\n<g id=\"brightness-2\"><path d=\"M10 2c-1.82 0-3.53.5-5 1.35 2.99 1.73 5 4.95 5 8.65s-2.01 6.92-5 8.65c1.47.85 3.18 1.35 5 1.35 5.52 0 10-4.48 10-10s-4.48-10-10-10z\"/></g>\n<g id=\"brightness-3\"><path d=\"M9 2c-1.05 0-2.05.16-3 .46 4.06 1.27 7 5.06 7 9.54 0 4.48-2.94 8.27-7 9.54.95.3 1.95.46 3 .46 5.52 0 10-4.48 10-10s-4.48-10-10-10z\"/></g>\n<g id=\"brightness-4\"><path d=\"M20 8.69v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-8 9.31c-.89 0-1.74-.2-2.5-.55 2.06-.95 3.5-3.03 3.5-5.45s-1.44-4.5-3.5-5.45c.76-.35 1.61-.55 2.5-.55 3.31 0 6 2.69 6 6s-2.69 6-6 6z\"/></g>\n<g id=\"brightness-5\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z\"/></g>\n<g id=\"brightness-6\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69v-12c3.31 0 6 2.69 6 6s-2.69 6-6 6z\"/></g>\n<g id=\"brightness-7\"><path d=\"M20 8.69v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-8 9.31c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z\"/></g>\n<g id=\"brush\"><path d=\"M7 14c-1.66 0-3 1.34-3 3 0 1.31-1.16 2-2 2 .92 1.22 2.49 2 4 2 2.21 0 4-1.79 4-4 0-1.66-1.34-3-3-3zm13.71-9.37l-1.34-1.34c-.39-.39-1.02-.39-1.41 0l-8.96 8.96 2.75 2.75 8.96-8.96c.39-.39.39-1.02 0-1.41z\"/></g>\n<g id=\"camera\"><path d=\"M9.4 10.5l4.77-8.26c-.7-.15-1.42-.24-2.17-.24-2.4 0-4.6.85-6.32 2.25l3.66 6.35.06-.1zm12.14-1.5c-.92-2.92-3.15-5.26-6-6.34l-3.66 6.34h9.66zm.26 1h-7.49l.29.5 4.76 8.25c1.64-1.78 2.64-4.14 2.64-6.75 0-.69-.07-1.35-.2-2zm-13.26 2l-3.9-6.75c-1.63 1.78-2.64 4.14-2.64 6.75 0 .69.07 1.35.2 2h7.49l-1.15-2zm-6.08 3c.92 2.92 3.15 5.26 6 6.34l3.66-6.34h-9.66zm11.27 0l-3.9 6.76c.7.15 1.42.24 2.17.24 2.4 0 4.6-.85 6.32-2.25l-3.66-6.35-.93 1.6z\"/></g>\n<g id=\"camera-alt\"><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2h-3.17l-1.83-2h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></g>\n<g id=\"camera-front\"><path d=\"M10 20h-5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zm-2-12c1.1 0 2-.9 2-2s-.9-2-2-2-1.99.9-1.99 2 .89 2 1.99 2zm5-8h-10c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 2h10v10.5c0-1.67-3.33-2.5-5-2.5s-5 .83-5 2.5v-10.5z\"/></g>\n<g id=\"camera-rear\"><path d=\"M10 20h-5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zm3-20h-10c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-5 6c-1.11 0-2-.9-2-2s.89-2 1.99-2 2 .9 2 2c.01 1.1-.89 2-1.99 2z\"/></g>\n<g id=\"camera-roll\"><path d=\"M14 5c0-1.1-.9-2-2-2h-1v-1c0-.55-.45-1-1-1h-4c-.55 0-1 .45-1 1v1h-1c-1.1 0-2 .9-2 2v15c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2h8v-15h-8zm-2 13h-2v-2h2v2zm0-9h-2v-2h2v2zm4 9h-2v-2h2v2zm0-9h-2v-2h2v2zm4 9h-2v-2h2v2zm0-9h-2v-2h2v2z\"/></g>\n<g id=\"center-focus-strong\"><path d=\"M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-7 7h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm0-10h4v-2h-4c-1.1 0-2 .9-2 2v4h2v-4zm14-2h-4v2h4v4h2v-4c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4z\"/></g>\n<g id=\"center-focus-weak\"><path d=\"M5 15h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm0-10h4v-2h-4c-1.1 0-2 .9-2 2v4h2v-4zm14-2h-4v2h4v4h2v-4c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm-7-11c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"collections\"><path d=\"M22 16v-12c0-1.1-.9-2-2-2h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71 2.97-3.71 4 5h-12l3-4zm-9-6v14c0 1.1.9 2 2 2h14v-2h-14v-14h-2z\"/></g>\n<g id=\"colorize\"><path d=\"M20.71 5.63l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-3.12 3.12-1.93-1.91-1.41 1.41 1.42 1.42-8.92 8.92v4.75h4.75l8.92-8.92 1.42 1.42 1.41-1.41-1.92-1.92 3.12-3.12c.4-.4.4-1.03.01-1.42zm-13.79 13.37l-1.92-1.92 8.06-8.06 1.92 1.92-8.06 8.06z\"/></g>\n<g id=\"color-lens\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5h1.77c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3-4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"compare\"><path d=\"M10 3h-5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h5v2h2v-22h-2v2zm0 15h-5l5-6v6zm9-15h-5v2h5v13l-5-6v9h5c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"control-point\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.51 0-10 4.49-10 10s4.49 10 10 10 10-4.49 10-10-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"control-point-duplicate\"><path d=\"M16 8h-2v3h-3v2h3v3h2v-3h3v-2h-3zm-14 4c0-2.79 1.64-5.2 4.01-6.32v-2.16c-3.49 1.24-6.01 4.57-6.01 8.48s2.52 7.24 6.01 8.48v-2.16c-2.37-1.12-4.01-3.53-4.01-6.32zm13-9c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9zm0 16c-3.86 0-7-3.14-7-7s3.14-7 7-7 7 3.14 7 7-3.14 7-7 7z\"/></g>\n<g id=\"crop-16-9\"><path d=\"M19 6h-14c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-8c0-1.1-.9-2-2-2zm0 10h-14v-8h14v8z\"/></g>\n<g id=\"crop\"><path d=\"M17 15h2v-8c0-1.1-.9-2-2-2h-8v2h8v8zm-10 2v-16h-2v4h-4v2h4v10c0 1.1.9 2 2 2h10v4h2v-4h4v-2h-16z\"/></g>\n<g id=\"crop-3-2\"><path d=\"M19 4h-14c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-14v-12h14v12z\"/></g>\n<g id=\"crop-5-4\"><path d=\"M19 5h-14c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-14v-10h14v10z\"/></g>\n<g id=\"crop-7-5\"><path d=\"M19 7h-14c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-6c0-1.1-.9-2-2-2zm0 8h-14v-6h14v6z\"/></g>\n<g id=\"crop-din\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"crop-free\"><path d=\"M3 5v4h2v-4h4v-2h-4c-1.1 0-2 .9-2 2zm2 10h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm14 4h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm0-16h-4v2h4v4h2v-4c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"crop-landscape\"><path d=\"M19 5h-14c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-14v-10h14v10z\"/></g>\n<g id=\"crop-original\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-5.04-6.71l-2.75 3.54-1.96-2.36-2.75 3.53h11l-3.54-4.71z\"/></g>\n<g id=\"crop-portrait\"><path d=\"M17 3h-10c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-10v-14h10v14z\"/></g>\n<g id=\"crop-square\"><path d=\"M18 4h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-12v-12h12v12z\"/></g>\n<g id=\"dehaze\"><path d=\"M2 15.5v2h20v-2h-20zm0-5v2h20v-2h-20zm0-5v2h20v-2h-20z\"/></g>\n<g id=\"details\"><path d=\"M3 4l9 16 9-16h-18zm3.38 2h11.25l-5.63 10-5.62-10z\"/></g>\n<g id=\"edit\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g>\n<g id=\"exposure\"><path d=\"M15 17v2h2v-2h2v-2h-2v-2h-2v2h-2v2h2zm5-15h-16c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-15 3h6v2h-6v-2zm15 15h-16l16-16v16z\"/></g>\n<g id=\"exposure-minus-1\"><path d=\"M4 11v2h8v-2h-8zm15 7h-2v-10.62l-3 1.02v-1.7l4.7-1.7h.3v13z\"/></g>\n<g id=\"exposure-minus-2\"><path d=\"M15.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17s.19-.79.19-1.18c0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55v1.49h8.63v-1.71h-5.95zm-13.05-5.29v2h8v-2h-8z\"/></g>\n<g id=\"exposure-plus-1\"><path d=\"M10 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm10 11h-2v-10.62l-3 1.02v-1.7l4.7-1.7h.3v13z\"/></g>\n<g id=\"exposure-plus-2\"><path d=\"M16.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17.13-.39.19-.79.19-1.18 0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55v1.49h8.63v-1.71h-5.95zm-8.05-9.29h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4z\"/></g>\n<g id=\"exposure-zero\"><path d=\"M16.14 12.5c0 1-.1 1.85-.3 2.55-.2.7-.48 1.27-.83 1.7-.36.44-.79.75-1.3.95-.51.2-1.07.3-1.7.3-.62 0-1.18-.1-1.69-.3-.51-.2-.95-.51-1.31-.95-.36-.44-.65-1.01-.85-1.7-.2-.7-.3-1.55-.3-2.55v-2.04c0-1 .1-1.85.3-2.55.2-.7.48-1.26.84-1.69.36-.43.8-.74 1.31-.93.5-.19 1.07-.29 1.69-.29.63 0 1.19.1 1.7.29.51.19.95.5 1.31.93.36.43.64.99.84 1.69.2.7.3 1.54.3 2.55v2.04zm-2.11-2.36c0-.64-.05-1.18-.13-1.62-.09-.44-.22-.79-.4-1.06-.17-.27-.39-.46-.64-.58-.25-.13-.54-.19-.86-.19-.32 0-.61.06-.86.18s-.47.31-.64.58c-.17.27-.31.62-.4 1.06s-.13.98-.13 1.62v2.67c0 .64.05 1.18.14 1.62.09.45.23.81.4 1.09s.39.48.64.61.54.19.87.19c.33 0 .62-.06.87-.19s.46-.33.63-.61c.17-.28.3-.64.39-1.09.09-.45.13-.99.13-1.62v-2.66z\"/></g>\n<g id=\"filter-1\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm11 10h2v-10h-4v2h2v8zm7-14h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-2\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-4-4h-4v-2h2c1.1 0 2-.89 2-2v-2c0-1.11-.9-2-2-2h-4v2h4v2h-2c-1.1 0-2 .89-2 2v4h6v-2z\"/></g>\n<g id=\"filter\"><path d=\"M15.96 10.29l-2.75 3.54-1.96-2.36-2.75 3.53h11l-3.54-4.71zm-12.96-5.29h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-3\"><path d=\"M21 1h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-18-12h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm14 8v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5v-1.5c0-1.11-.9-2-2-2h-4v2h4v2h-2v2h2v2h-4v2h4c1.1 0 2-.89 2-2z\"/></g>\n<g id=\"filter-4\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm12 10h2v-10h-2v4h-2v-4h-2v6h4v4zm6-14h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-5\"><path d=\"M21 1h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-18-12h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm14 8v-2c0-1.11-.9-2-2-2h-2v-2h4v-2h-6v6h4v2h-4v2h4c1.1 0 2-.89 2-2z\"/></g>\n<g id=\"filter-6\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-8-2h2c1.1 0 2-.89 2-2v-2c0-1.11-.9-2-2-2h-2v-2h4v-2h-4c-1.1 0-2 .89-2 2v6c0 1.11.9 2 2 2zm0-4h2v2h-2v-2z\"/></g>\n<g id=\"filter-7\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-8-2l4-8v-2h-6v2h4l-4 8h2z\"/></g>\n<g id=\"filter-8\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-8-2h2c1.1 0 2-.89 2-2v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5v-1.5c0-1.11-.9-2-2-2h-2c-1.1 0-2 .89-2 2v1.5c0 .83.67 1.5 1.5 1.5-.83 0-1.5.67-1.5 1.5v1.5c0 1.11.9 2 2 2zm0-8h2v2h-2v-2zm0 4h2v2h-2v-2z\"/></g>\n<g id=\"filter-9\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-6-12h-2c-1.1 0-2 .89-2 2v2c0 1.11.9 2 2 2h2v2h-4v2h4c1.1 0 2-.89 2-2v-6c0-1.11-.9-2-2-2zm0 4h-2v-2h2v2z\"/></g>\n<g id=\"filter-9-plus\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm11 7v-4c0-1.11-.9-2-2-2h-1c-1.1 0-2 .89-2 2v1c0 1.11.9 2 2 2h1v1h-3v2h3c1.1 0 2-.89 2-2zm-3-3v-1h1v1h-1zm10-8h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 8h-2v-2h-2v2h-2v2h2v2h2v-2h2v6h-14v-14h14v6z\"/></g>\n<g id=\"filter-b-and-w\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16l-7-8v8h-7l7-8v-6h7v14z\"/></g>\n<g id=\"filter-center-focus\"><path d=\"M5 15h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm0-10h4v-2h-4c-1.1 0-2 .9-2 2v4h2v-4zm14-2h-4v2h4v4h2v-4c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm-7-10c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"filter-drama\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.39 1.64-6.64 4.04-3.01.32-5.36 2.86-5.36 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-.35 7.96h-13c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4h2c0-2.76-1.86-5.08-4.4-5.78 1.01-1.34 2.6-2.22 4.4-2.22 3.03 0 5.5 2.47 5.5 5.5v.5h1.5c1.65 0 3 1.35 3 3s-1.35 3-3 3z\"/></g>\n<g id=\"filter-frames\"><path d=\"M20 4h-4l-4-4-4 4h-4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-16v-14h4.52l3.52-3.5 3.48 3.5h4.48v14zm-2-12h-12v10h12\"/></g>\n<g id=\"filter-hdr\"><path d=\"M14 6l-3.75 5 2.85 3.8-1.6 1.2c-1.69-2.25-4.5-6-4.5-6l-6 8h22l-9-12z\"/></g>\n<g id=\"filter-none\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-retrolux\"><path d=\"M13 16.43l6-9.43-7-7-7 7 6 9.43v.11c-.6-.35-1.29-.54-2-.54-2.21 0-4 1.79-4 4s1.79 4 4 4c1.85 0 3.41-1.26 3.86-2.96l2.97 2.96 1.42-1.41-4.25-4.25v-1.91zm-2 3.57c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.53 0 1.04.21 1.41.58l.59.59v.83z\"/></g>\n<g id=\"filter-tilt-shift\"><path d=\"M11 4.07v-2.02c-2.01.2-3.84 1-5.32 2.21l1.42 1.43c1.11-.86 2.44-1.44 3.9-1.62zm7.32.19c-1.48-1.21-3.31-2.01-5.32-2.21v2.02c1.46.18 2.79.76 3.9 1.62l1.42-1.43zm1.61 6.74h2.02c-.2-2.01-1-3.84-2.21-5.32l-1.43 1.42c.86 1.11 1.44 2.44 1.62 3.9zm-14.24-3.9l-1.43-1.42c-1.21 1.48-2.01 3.31-2.21 5.32h2.02c.18-1.46.76-2.79 1.62-3.9zm-1.62 5.9h-2.02c.2 2.01 1 3.84 2.21 5.32l1.43-1.43c-.86-1.1-1.44-2.43-1.62-3.89zm10.93-1c0-1.66-1.34-3-3-3s-3 1.34-3 3 1.34 3 3 3 3-1.34 3-3zm3.31 4.9l1.43 1.43c1.21-1.48 2.01-3.32 2.21-5.32h-2.02c-.18 1.45-.76 2.78-1.62 3.89zm-5.31 3.03v2.02c2.01-.2 3.84-1 5.32-2.21l-1.43-1.43c-1.1.86-2.43 1.44-3.89 1.62zm-7.32-.19c1.48 1.21 3.32 2.01 5.32 2.21v-2.02c-1.46-.18-2.79-.76-3.9-1.62l-1.42 1.43z\"/></g>\n<g id=\"filter-vintage\"><path d=\"M18.7 12.4c-.28-.16-.57-.29-.86-.4.29-.11.58-.24.86-.4 1.92-1.11 2.99-3.12 3-5.19-1.79-1.03-4.07-1.11-6 0-.28.16-.54.35-.78.54.05-.31.08-.63.08-.95 0-2.22-1.21-4.15-3-5.19-1.79 1.04-3 2.97-3 5.19 0 .32.03.64.08.95-.24-.2-.5-.39-.78-.55-1.92-1.11-4.2-1.03-6 0 0 2.07 1.07 4.08 3 5.19.28.16.57.29.86.4-.29.11-.58.24-.86.4-1.92 1.11-2.99 3.12-3 5.19 1.79 1.03 4.07 1.11 6 0 .28-.16.54-.35.78-.54-.05.32-.08.64-.08.96 0 2.22 1.21 4.15 3 5.19 1.79-1.04 3-2.97 3-5.19 0-.32-.03-.64-.08-.95.24.2.5.38.78.54 1.92 1.11 4.2 1.03 6 0-.01-2.07-1.08-4.08-3-5.19zm-6.7 3.6c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z\"/></g>\n<g id=\"flare\"><path d=\"M7 11h-6v2h6v-2zm2.17-3.24l-2.12-2.12-1.41 1.41 2.12 2.12 1.41-1.41zm3.83-6.76h-2v6h2v-6zm5.36 6.05l-1.41-1.41-2.12 2.12 1.41 1.41 2.12-2.12zm-1.36 3.95v2h6v-2h-6zm-5-2c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm2.83 7.24l2.12 2.12 1.41-1.41-2.12-2.12-1.41 1.41zm-9.19.71l1.41 1.41 2.12-2.12-1.41-1.41-2.12 2.12zm5.36 6.05h2v-6h-2v6z\"/></g>\n<g id=\"flash-auto\"><path d=\"M3 2v12h3v9l7-12h-4l4-9h-10zm16 0h-2l-3.2 9h1.9l.7-2h3.2l.7 2h1.9l-3.2-9zm-2.15 5.65l1.15-3.65 1.15 3.65h-2.3z\"/></g>\n<g id=\"flash-off\"><path d=\"M3.27 3l-1.27 1.27 5 5v3.73h3v9l3.58-6.14 4.15 4.14 1.27-1.27-15.73-15.73zm13.73 7h-4l4-8h-10v2.18l8.46 8.46 1.54-2.64z\"/></g>\n<g id=\"flash-on\"><path d=\"M7 2v11h3v9l7-12h-4l4-8z\"/></g>\n<g id=\"flip\"><path d=\"M15 21h2v-2h-2v2zm4-12h2v-2h-2v2zm-16-4v14c0 1.1.9 2 2 2h4v-2h-4v-14h4v-2h-4c-1.1 0-2 .9-2 2zm16-2v2h2c0-1.1-.9-2-2-2zm-8 20h2v-22h-2v22zm8-6h2v-2h-2v2zm-4-12h2v-2h-2v2zm4 8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2z\"/></g>\n<g id=\"gradient\"><path d=\"M11 9h2v2h-2zm-2 2h2v2h-2zm4 0h2v2h-2zm2-2h2v2h-2zm-8 0h2v2h-2zm12-6h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 15h-2v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2h-2v-2h-2v2h-2v-2h2v-2h-2v-6h14v6z\"/></g>\n<g id=\"grain\"><path d=\"M10 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-4 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"grid-off\"><path d=\"M8 4v1.45l2 2v-3.45h4v4h-3.45l2 2h1.45v1.45l2 2v-3.45h4v4h-3.45l2 2h1.45v1.45l2 2v-15.45c0-1.1-.9-2-2-2h-15.45l2 2h1.45zm8 0h4v4h-4v-4zm-14.73-2.73l-1.27 1.28 2 2v15.45c0 1.1.9 2 2 2h15.46l2 2 1.27-1.27-21.46-21.46zm8.73 11.28l1.45 1.45h-1.45v-1.45zm-6-6l1.45 1.45h-1.45v-1.45zm4 13.45h-4v-4h4v4zm0-6h-4v-4h3.45l.55.55v3.45zm6 6h-4v-4h3.45l.55.54v3.46zm2 0v-1.46l1.46 1.46h-1.46z\"/></g>\n<g id=\"grid-on\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 18h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4v-4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4v-4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4v-4h4v4z\"/></g>\n<g id=\"hdr-off\"><path d=\"M18 17l-14.73-14.73-1.27 1.28 4 4v3.45h-2v-4h-2v10h2v-4h2v4h2v-7.45l1 1v6.45h4c.67 0 1.26-.33 1.62-.84l6.34 6.34 1.27-1.27-4.23-4.23zm-5-2h-2v-2.45l2 2v.45zm5-2h1l.82 3.27.73.73h1.45l-1.19-4.17c.7-.31 1.19-1.01 1.19-1.83v-2c0-1.1-.9-2-2-2h-4v5.45l2 2v-1.45zm0-4h2v2h-2v-2zm-3 2.45v-2.45c0-1.1-.9-2-2-2h-2.45l4.45 4.45z\"/></g>\n<g id=\"hdr-on\"><path d=\"M6 11h-2v-4h-2v10h2v-4h2v4h2v-10h-2v4zm7-4h-4v10h4c1.1 0 2-.9 2-2v-6c0-1.1-.9-2-2-2zm0 8h-2v-6h2v6zm9-4v-2c0-1.1-.9-2-2-2h-4v10h2v-4h1l1 4h2l-1.19-4.17c.7-.31 1.19-1.01 1.19-1.83zm-2 0h-2v-2h2v2z\"/></g>\n<g id=\"hdr-plus-off\"><path d=\"M9.5 5h1.5v2.45l2 2v-4.45h3.5c.83 0 1.5.67 1.5 1.5v3c0 .83-.67 1.5-1.5 1.5h-1.95l7.52 7.52c1.22-1.88 1.93-4.11 1.93-6.52 0-6.63-5.37-12-12-12-2.41 0-4.64.71-6.52 1.93l4.02 4.02v-.95zm0 9.5h-2v1h2v-1zm7-8h-2v3h2v-3zm-16-4.45l2.28 2.28c-1.74 2.07-2.78 4.75-2.78 7.67 0 6.63 5.37 12 12 12 2.92 0 5.6-1.04 7.68-2.78l2.28 2.28 1.27-1.27-21.46-21.46-1.27 1.28zm12.5 13.45h.96l2.54 2.55v.95h-1.5v-2h-2v-1.5zm-7-7.95l1.5 1.5v1.95h-1.5v-3.45zm0 5.45h3.5c.83 0 1.5.67 1.5 1.5v1c0 .62-.38 1.15-.91 1.38l.91 2.12h-1.5l-.86-2h-1.14v2h-1.5v-6z\"/></g>\n<g id=\"hdr-plus-on\"><path d=\"M12 0c-6.63 0-12 5.37-12 12s5.37 12 12 12 12-5.37 12-12-5.37-12-12-12zm-1 15.5c0 .62-.37 1.15-.91 1.38l.91 2.12h-1.5l-.86-2h-1.14v2h-1.5v-6h3.5c.83 0 1.5.67 1.5 1.5v1zm0-4.5h-1.5v-2.5h-2v2.5h-1.5v-6h1.5v2h2v-2h1.5v6zm2-6h3.5c.83 0 1.5.67 1.5 1.5v3c0 .83-.67 1.5-1.5 1.5h-3.5v-6zm5.5 12h-2v2h-1.5v-2h-2v-1.5h2v-2h1.5v2h2v1.5zm-11-1.5h2v-1h-2v1zm9-9h-2v3h2v-3z\"/></g>\n<g id=\"hdr-strong\"><path d=\"M17 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-12 2c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"hdr-weak\"><path d=\"M5 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm12-2c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z\"/></g>\n<g id=\"healing\"><path d=\"M17.73 12.02l3.98-3.98c.39-.39.39-1.02 0-1.41l-4.34-4.34c-.39-.39-1.02-.39-1.41 0l-3.98 3.98-3.98-3.98c-.2-.19-.45-.29-.71-.29-.25 0-.51.1-.7.29l-4.34 4.34c-.39.39-.39 1.02 0 1.41l3.98 3.98-3.98 3.98c-.39.39-.39 1.02 0 1.41l4.34 4.34c.39.39 1.02.39 1.41 0l3.98-3.98 3.98 3.98c.2.2.45.29.71.29.26 0 .51-.1.71-.29l4.34-4.34c.39-.39.39-1.02 0-1.41l-3.99-3.98zm-5.73-3.02c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-4.71 1.96l-3.63-3.62 3.63-3.63 3.62 3.62-3.62 3.63zm2.71 2.04c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2 2c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2-4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2.66 9.34l-3.63-3.62 3.63-3.63 3.62 3.62-3.62 3.63z\"/></g>\n<g id=\"image\"><path d=\"M21 19v-14c0-1.1-.9-2-2-2h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zm-12.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"image-aspect-ratio\"><path d=\"M16 10h-2v2h2v-2zm0 4h-2v2h2v-2zm-8-4h-2v2h2v-2zm4 0h-2v2h2v-2zm8-6h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-16v-12h16v12z\"/></g>\n<g id=\"iso\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-13.5 4.5h2v-2h1.5v2h2v1.5h-2v2h-1.5v-2h-2v-1.5zm13.5 11.5h-14l14-14v14zm-2-2v-1.5h-5v1.5h5z\"/></g>\n<g id=\"landscape\"><path d=\"M14 6l-3.75 5 2.85 3.8-1.6 1.2c-1.69-2.25-4.5-6-4.5-6l-6 8h22l-9-12z\"/></g>\n<g id=\"leak-add\"><path d=\"M6 3h-3v3c1.66 0 3-1.34 3-3zm8 0h-2c0 4.97-4.03 9-9 9v2c6.08 0 11-4.93 11-11zm-4 0h-2c0 2.76-2.24 5-5 5v2c3.87 0 7-3.13 7-7zm0 18h2c0-4.97 4.03-9 9-9v-2c-6.07 0-11 4.93-11 11zm8 0h3v-3c-1.66 0-3 1.34-3 3zm-4 0h2c0-2.76 2.24-5 5-5v-2c-3.87 0-7 3.13-7 7z\"/></g>\n<g id=\"leak-remove\"><path d=\"M10 3h-2c0 .37-.04.72-.12 1.06l1.59 1.59c.34-.81.53-1.71.53-2.65zm-7 1.27l2.84 2.84c-.81.56-1.78.89-2.84.89v2c1.61 0 3.09-.55 4.27-1.46l1.43 1.43c-1.56 1.27-3.54 2.03-5.7 2.03v2c2.71 0 5.19-.99 7.11-2.62l2.5 2.5c-1.62 1.93-2.61 4.41-2.61 7.12h2c0-2.16.76-4.14 2.03-5.69l1.43 1.43c-.91 1.17-1.46 2.65-1.46 4.26h2c0-1.06.33-2.03.89-2.84l2.84 2.84 1.27-1.27-16.73-16.73-1.27 1.27zm11-1.27h-2c0 1.5-.37 2.91-1.02 4.16l1.46 1.46c.98-1.64 1.56-3.56 1.56-5.62zm5.94 13.12c.34-.08.69-.12 1.06-.12v-2c-.94 0-1.84.19-2.66.52l1.6 1.6zm-4.56-4.56l1.46 1.46c1.25-.65 2.66-1.02 4.16-1.02v-2c-2.06 0-3.98.58-5.62 1.56z\"/></g>\n<g id=\"lens\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z\"/></g>\n<g id=\"looks\"><path d=\"M12 10c-3.86 0-7 3.14-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.86-3.14-7-7-7zm0-4c-6.07 0-11 4.93-11 11h2c0-4.96 4.04-9 9-9s9 4.04 9 9h2c0-6.07-4.93-11-11-11z\"/></g>\n<g id=\"looks-3\"><path d=\"M19.01 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 7.5c0 .83-.67 1.5-1.5 1.5.83 0 1.5.67 1.5 1.5v1.5c0 1.11-.9 2-2 2h-4v-2h4v-2h-2v-2h2v-2h-4v-2h4c1.1 0 2 .89 2 2v1.5z\"/></g>\n<g id=\"looks-4\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 14h-2v-4h-4v-6h2v4h2v-4h2v10z\"/></g>\n<g id=\"looks-5\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2h-4v-2h4v-2h-4v-6h6v2z\"/></g>\n<g id=\"looks-6\"><path d=\"M11 15h2v-2h-2v2zm8-12h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2h-2c-1.1 0-2-.89-2-2v-6c0-1.11.9-2 2-2h4v2z\"/></g>\n<g id=\"looks-one\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-5 14h-2v-8h-2v-2h4v10z\"/></g>\n<g id=\"looks-two\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 8c0 1.11-.9 2-2 2h-2v2h4v2h-6v-4c0-1.11.9-2 2-2h2v-2h-4v-2h4c1.1 0 2 .89 2 2v2z\"/></g>\n<g id=\"loupe\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.51 0-10 4.49-10 10s4.49 10 10 10h8c1.1 0 2-.9 2-2v-8c0-5.51-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"movie-creation\"><path d=\"M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4h-2l2 4h-3l-2-4h-1c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-14h-4z\"/></g>\n<g id=\"nature\"><path d=\"M13 16.12c3.47-.41 6.17-3.36 6.17-6.95 0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89v3.94h-6v2h14v-2h-6v-3.88z\"/></g>\n<g id=\"nature-people\"><path d=\"M22.17 9.17c0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89v3.94h-8v-3h1v-4c0-.55-.45-1-1-1h-3c-.55 0-1 .45-1 1v4h1v5h16v-2h-3v-3.88c3.47-.41 6.17-3.36 6.17-6.95zm-17.67 1.83c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5z\"/></g>\n<g id=\"navigate-before\"><path d=\"M15.41 7.41l-1.41-1.41-6 6 6 6 1.41-1.41-4.58-4.59z\"/></g>\n<g id=\"navigate-next\"><path d=\"M10 6l-1.41 1.41 4.58 4.59-4.58 4.59 1.41 1.41 6-6z\"/></g>\n<g id=\"palette\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5h1.77c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3-4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"panorama\"><path d=\"M23 18v-12c0-1.1-.9-2-2-2h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-14.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"panorama-fisheye\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"panorama-horizontal\"><path d=\"M20 6.54v10.91c-2.6-.77-5.28-1.16-8-1.16-2.72 0-5.4.39-8 1.16v-10.91c2.6.77 5.28 1.16 8 1.16 2.72.01 5.4-.38 8-1.16m1.43-2.54c-.1 0-.2.02-.31.06-2.94 1.1-6.03 1.64-9.12 1.64-3.09 0-6.18-.55-9.12-1.64-.11-.04-.22-.06-.31-.06-.34 0-.57.23-.57.63v14.75c0 .39.23.62.57.62.1 0 .2-.02.31-.06 2.94-1.1 6.03-1.64 9.12-1.64 3.09 0 6.18.55 9.12 1.64.11.04.21.06.31.06.33 0 .57-.23.57-.63v-14.74c0-.4-.24-.63-.57-.63z\"/></g>\n<g id=\"panorama-vertical\"><path d=\"M19.94 21.12c-1.1-2.94-1.64-6.03-1.64-9.12 0-3.09.55-6.18 1.64-9.12.04-.11.06-.22.06-.31 0-.34-.23-.57-.63-.57h-14.74c-.4 0-.63.23-.63.57 0 .1.02.2.06.31 1.1 2.94 1.65 6.03 1.65 9.12 0 3.09-.55 6.18-1.64 9.12-.05.11-.07.22-.07.31 0 .33.23.57.63.57h14.75c.39 0 .63-.24.63-.57-.01-.1-.03-.2-.07-.31zm-13.4-1.12c.77-2.6 1.16-5.28 1.16-8 0-2.72-.39-5.4-1.16-8h10.91c-.77 2.6-1.16 5.28-1.16 8 0 2.72.39 5.4 1.16 8h-10.91z\"/></g>\n<g id=\"panorama-wide-angle\"><path d=\"M12 6c2.45 0 4.71.2 7.29.64.47 1.78.71 3.58.71 5.36 0 1.78-.24 3.58-.71 5.36-2.58.44-4.84.64-7.29.64s-4.71-.2-7.29-.64c-.47-1.78-.71-3.58-.71-5.36 0-1.78.24-3.58.71-5.36 2.58-.44 4.84-.64 7.29-.64m0-2c-2.73 0-5.22.24-7.95.72l-.93.16-.25.9c-.58 2.07-.87 4.15-.87 6.22s.29 4.15.87 6.22l.25.89.93.16c2.73.49 5.22.73 7.95.73s5.22-.24 7.95-.72l.93-.16.25-.89c.58-2.08.87-4.16.87-6.23s-.29-4.15-.87-6.22l-.25-.89-.93-.16c-2.73-.49-5.22-.73-7.95-.73z\"/></g>\n<g id=\"photo\"><path d=\"M21 19v-14c0-1.1-.9-2-2-2h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zm-12.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"photo-album\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8zm0 15l3-3.86 2.14 2.58 3-3.86 3.86 5.14h-12z\"/></g>\n<g id=\"photo-camera\"><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2h-3.17l-1.83-2h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></g>\n<g id=\"photo-library\"><path d=\"M22 16v-12c0-1.1-.9-2-2-2h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71 2.97-3.71 4 5h-12l3-4zm-9-6v14c0 1.1.9 2 2 2h14v-2h-14v-14h-2z\"/></g>\n<g id=\"photosphere\"><path d=\"M22.07 7.59c-1.7-3.88-5.56-6.59-10.07-6.59s-8.37 2.71-10.07 6.59c-.65.28-1.3.58-1.93.91v7c.63.33 1.28.63 1.93.91 1.7 3.88 5.56 6.59 10.07 6.59s8.37-2.71 10.07-6.59c.65-.28 1.29-.58 1.93-.91v-7c-.63-.33-1.28-.63-1.93-.91zm-10.07-5.09c3.31 0 6.23 1.7 7.93 4.28-2.58-.85-5.25-1.28-7.93-1.28-2.68 0-5.35.43-7.93 1.28 1.7-2.58 4.62-4.28 7.93-4.28zm0 19c-3.31 0-6.23-1.7-7.93-4.28 2.58.85 5.25 1.28 7.93 1.28 2.68 0 5.35-.43 7.93-1.28-1.7 2.58-4.62 4.28-7.93 4.28zm10.5-6.92l-.29.13c-1.08.51-2.21.92-3.35 1.27l-3.86-4.42-3 3.44-4-5-4.38 5.47c-.62-.23-1.23-.47-1.83-.75l-.29-.14v-5.16l.29-.13c6.4-2.99 14.02-2.99 20.42 0l.29.13v5.16z\"/></g>\n<g id=\"portrait\"><path d=\"M12 12.25c1.24 0 2.25-1.01 2.25-2.25s-1.01-2.25-2.25-2.25-2.25 1.01-2.25 2.25 1.01 2.25 2.25 2.25zm4.5 4c0-1.5-3-2.25-4.5-2.25s-4.5.75-4.5 2.25v.75h9v-.75zm2.5-13.25h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"remove-red-eye\"><path d=\"M12 4.5c-5 0-9.27 3.11-11 7.5 1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"rotate-left\"><path d=\"M7.11 8.53l-1.41-1.42c-.9 1.16-1.46 2.5-1.63 3.89h2.02c.14-.87.49-1.72 1.02-2.47zm-1.02 4.47h-2.02c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61v-2.03c-.87-.15-1.71-.49-2.46-1.03l-1.44 1.45zm5.9-14.25v-3.07l-4.55 4.55 4.55 4.45v-3.91c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"/></g>\n<g id=\"rotate-right\"><path d=\"M15.55 5.55l-4.55-4.55v3.07c-3.94.49-7 3.85-7 7.93s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91v3.91l4.55-4.45zm4.38 5.45c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zm-6.93 6.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z\"/></g>\n<g id=\"slideshow\"><path d=\"M10 8v8l5-4-5-4zm9-5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"straighten\"><path d=\"M21 6h-18c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-8c0-1.1-.9-2-2-2zm0 10h-18v-8h2v4h2v-4h2v4h2v-4h2v4h2v-4h2v4h2v-4h2v8z\"/></g>\n<g id=\"style\"><path d=\"M2.53 19.65l1.34.56v-9.03l-2.43 5.86c-.41 1.02.08 2.19 1.09 2.61zm19.5-3.7l-4.96-11.97c-.31-.75-1.04-1.21-1.81-1.23-.26 0-.53.04-.79.15l-7.37 3.05c-.75.31-1.21 1.03-1.23 1.8-.01.27.04.54.15.8l4.96 11.97c.31.76 1.05 1.22 1.83 1.23.26 0 .52-.05.77-.15l7.36-3.05c1.02-.42 1.51-1.59 1.09-2.6zm-14.15-7.2c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-2 11c0 1.1.9 2 2 2h1.45l-3.45-8.34v6.34z\"/></g>\n<g id=\"switch-camera\"><path d=\"M20 4h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-5 11.5v-2.5h-6v2.5l-3.5-3.5 3.5-3.5v2.5h6v-2.5l3.5 3.5-3.5 3.5z\"/></g>\n<g id=\"switch-video\"><path d=\"M18 9.5v-3.5c0-.55-.45-1-1-1h-14c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h14c.55 0 1-.45 1-1v-3.5l4 4v-13l-4 4zm-5 6v-2.5h-6v2.5l-3.5-3.5 3.5-3.5v2.5h6v-2.5l3.5 3.5-3.5 3.5z\"/></g>\n<g id=\"tag-faces\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5h-10.22c.8 2.04 2.78 3.5 5.11 3.5z\"/></g>\n<g id=\"texture\"><path d=\"M19.51 3.08l-16.43 16.43c.09.34.27.65.51.9.25.24.56.42.9.51l16.44-16.43c-.19-.69-.73-1.23-1.42-1.41zm-7.63-.08l-8.88 8.88v2.83l11.71-11.71h-2.83zm-6.88 0c-1.1 0-2 .9-2 2v2l4-4h-2zm14 18c.55 0 1.05-.22 1.41-.59.37-.36.59-.86.59-1.41v-2l-4 4h2zm-9.71 0h2.83l8.88-8.88v-2.83l-11.71 11.71z\"/></g>\n<g id=\"timelapse\"><path d=\"M16.24 7.76c-1.17-1.17-2.7-1.76-4.24-1.76v6l-4.24 4.24c2.34 2.34 6.14 2.34 8.49 0 2.34-2.34 2.34-6.14-.01-8.48zm-4.24-5.76c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"timer-10\"><path d=\"M0 7.72v1.68l3-1v9.6h2v-12h-.25l-4.75 1.72zm23.78 6.65c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39 0-.14.03-.28.09-.41.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59-.43-.15-.92-.22-1.46-.22-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.69.23.96c.15.28.36.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02zm-9.96-7.32c-.34-.4-.75-.7-1.23-.88-.47-.18-1.01-.27-1.59-.27-.58 0-1.11.09-1.59.27-.48.18-.89.47-1.23.88-.34.41-.6.93-.79 1.59-.18.65-.28 1.45-.28 2.39v1.92c0 .94.09 1.74.28 2.39.19.66.45 1.19.8 1.6.34.41.75.71 1.23.89.48.18 1.01.28 1.59.28.59 0 1.12-.09 1.59-.28.48-.18.88-.48 1.22-.89.34-.41.6-.94.78-1.6.18-.65.28-1.45.28-2.39v-1.92c0-.94-.09-1.74-.28-2.39-.18-.66-.44-1.19-.78-1.59zm-.92 6.17c0 .6-.04 1.11-.12 1.53-.08.42-.2.76-.36 1.02-.16.26-.36.45-.59.57-.23.12-.51.18-.82.18-.3 0-.58-.06-.82-.18s-.44-.31-.6-.57c-.16-.26-.29-.6-.38-1.02-.09-.42-.13-.93-.13-1.53v-2.5c0-.6.04-1.11.13-1.52.09-.41.21-.74.38-1 .16-.25.36-.43.6-.55.24-.11.51-.17.81-.17.31 0 .58.06.81.17.24.11.44.29.6.55.16.25.29.58.37.99.08.41.13.92.13 1.52v2.51z\"/></g>\n<g id=\"timer\"><path d=\"M15 1h-6v2h6v-2zm-4 13h2v-6h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42c-1.55-1.24-3.5-1.98-5.62-1.98-4.97 0-9 4.03-9 9s4.02 9 9 9 9-4.03 9-9c0-2.12-.74-4.07-1.97-5.61zm-7.03 12.61c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"timer-3\"><path d=\"M11.61 12.97c-.16-.24-.36-.46-.62-.65-.25-.19-.56-.35-.93-.48.3-.14.57-.3.8-.5.23-.2.42-.41.57-.64.15-.23.27-.46.34-.71.08-.24.11-.49.11-.73 0-.55-.09-1.04-.28-1.46-.18-.42-.44-.77-.78-1.06-.33-.28-.73-.5-1.2-.64-.45-.13-.97-.2-1.53-.2-.55 0-1.06.08-1.52.24-.47.17-.87.4-1.2.69-.33.29-.6.63-.78 1.03-.2.39-.29.83-.29 1.29h1.98c0-.26.05-.49.14-.69.09-.2.22-.38.38-.52.17-.14.36-.25.58-.33.22-.08.46-.12.73-.12.61 0 1.06.16 1.36.47.3.31.44.75.44 1.32 0 .27-.04.52-.12.74-.08.22-.21.41-.38.57-.17.16-.38.28-.63.37-.25.09-.55.13-.89.13h-1.17v1.57h1.18c.34 0 .64.04.91.11.27.08.5.19.69.35.19.16.34.36.44.61.1.24.16.54.16.87 0 .62-.18 1.09-.53 1.42-.35.33-.84.49-1.45.49-.29 0-.56-.04-.8-.13-.24-.08-.44-.2-.61-.36-.17-.16-.3-.34-.39-.56-.09-.22-.14-.46-.14-.72h-1.99c0 .55.11 1.03.32 1.45.21.42.5.77.86 1.05s.77.49 1.24.63.96.21 1.48.21c.57 0 1.09-.08 1.58-.23.49-.15.91-.38 1.26-.68.36-.3.64-.66.84-1.1.2-.43.3-.93.3-1.48 0-.29-.04-.58-.11-.86-.08-.25-.19-.51-.35-.76zm9.26 1.4c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39s.03-.28.09-.41c.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59-.43-.15-.92-.22-1.46-.22-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.68.23.96c.15.28.37.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02z\"/></g>\n<g id=\"timer-auto\"><path d=\"M12 4c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 10c-2.67 0-8 1.34-8 4v2h16v-2c0-2.67-5.33-4-8-4z\"/></g>\n<g id=\"timer-off\"><path d=\"M19.04 4.55l-1.42 1.42c-1.55-1.23-3.5-1.97-5.62-1.97-1.83 0-3.53.55-4.95 1.48l1.46 1.46c1.02-.59 2.22-.94 3.49-.94 3.87 0 7 3.13 7 7 0 1.27-.35 2.47-.94 3.49l1.45 1.45c.94-1.41 1.49-3.11 1.49-4.94 0-2.12-.74-4.07-1.97-5.61l1.42-1.42-1.41-1.42zm-4.04-3.55h-6v2h6v-2zm-4 8.44l2 2v-3.44h-2v1.44zm-7.98-5.44l-1.27 1.27 2.75 2.76c-.95 1.42-1.5 3.13-1.5 4.97 0 4.97 4.02 9 9 9 1.84 0 3.55-.55 4.98-1.5l2.5 2.5 1.27-1.27-7.71-7.71-10.02-10.02zm8.98 16c-3.87 0-7-3.13-7-7 0-1.28.35-2.48.95-3.52l9.56 9.56c-1.03.61-2.23.96-3.51.96z\"/></g>\n<g id=\"tonality\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-1 17.93c-3.94-.49-7-3.85-7-7.93s3.05-7.44 7-7.93v15.86zm2-15.86c1.03.13 2 .45 2.87.93h-2.87v-.93zm0 2.93h5.24c.25.31.48.65.68 1h-5.92v-1zm0 3h6.74c.08.33.15.66.19 1h-6.93v-1zm0 9.93v-.93h2.87c-.87.48-1.84.8-2.87.93zm5.24-2.93h-5.24v-1h5.92c-.2.35-.43.69-.68 1zm1.5-3h-6.74v-1h6.93c-.04.34-.11.67-.19 1z\"/></g>\n<g id=\"transform\"><path d=\"M22 18v-2h-14v-12h2l-3-3-3 3h2v2h-4v2h4v8c0 1.1.9 2 2 2h8v2h-2l3 3 3-3h-2v-2h4zm-12-10h6v6h2v-6c0-1.1-.9-2-2-2h-6v2z\"/></g>\n<g id=\"tune\"><path d=\"M3 17v2h6v-2h-6zm0-12v2h10v-2h-10zm10 16v-2h8v-2h-8v-2h-2v6h2zm-6-12v2h-4v2h4v2h2v-6h-2zm14 4v-2h-10v2h10zm-6-4h2v-2h4v-2h-4v-2h-2v6z\"/></g>\n<g id=\"wb-auto\"><path d=\"M6.85 12.65h2.3l-1.15-3.65-1.15 3.65zm15.15-5.65l-1.2 6.29-1.5-6.29h-1.6l-1.49 6.29-1.21-6.29h-.76c-1.47-1.83-3.71-3-6.24-3-4.42 0-8 3.58-8 8s3.58 8 8 8c3.13 0 5.84-1.81 7.15-4.43l.1.43h1.75l1.5-6.1 1.5 6.1h1.75l2.05-9h-1.8zm-11.7 9l-.7-2h-3.2l-.7 2h-1.9l3.2-9h2l3.2 9h-1.9z\"/></g>\n<g id=\"wb-cloudy\"><path d=\"M19.36 10.04c-.69-3.45-3.72-6.04-7.36-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.64-4.96z\"/></g>\n<g id=\"wb-incandescent\"><path d=\"M3.55 18.54l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8zm7.45 3.91h2v-2.95h-2v2.95zm-7-11.95h-3v2h3v-2zm11-4.19v-4.81h-6v4.81c-1.79 1.04-3 2.97-3 5.19 0 3.31 2.69 6 6 6s6-2.69 6-6c0-2.22-1.21-4.15-3-5.19zm5 4.19v2h3v-2h-3zm-2.76 7.66l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4z\"/></g>\n<g id=\"wb-irradescent\"><path d=\"M5 14.5h14v-6h-14v6zm6-13.95v2.95h2v-2.95h-2zm8.04 2.5l-1.79 1.79 1.41 1.41 1.8-1.79-1.42-1.41zm-6.04 19.4v-2.95h-2v2.95h2zm7.45-3.91l-1.8-1.79-1.41 1.41 1.79 1.8 1.42-1.42zm-16.9-14.08l1.79 1.79 1.41-1.41-1.79-1.79-1.41 1.41zm1.41 15.49l1.79-1.8-1.41-1.41-1.79 1.79 1.41 1.42z\"/></g>\n<g id=\"wb-sunny\"><path d=\"M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zm-2.76 5.66h-3v2h3v-2zm9-9.95h-2v2.95h2v-2.95zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zm2.76-7.66v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2v-2.95h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/maps-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"maps\" iconSize=\"24\">\n<svg><defs>\n<g id=\"beenhere\"><path d=\"M19 1h-14c-1.1 0-1.99.9-1.99 2l-.01 12.93c0 .69.35 1.3.88 1.66l8.12 5.41 8.11-5.41c.53-.36.88-.97.88-1.66l.01-12.93c0-1.1-.9-2-2-2zm-9 15l-5-5 1.41-1.41 3.59 3.58 7.59-7.59 1.41 1.42-9 9z\"/></g>\n<g id=\"directions\"><path d=\"M21.71 11.29l-9-9c-.39-.39-1.02-.39-1.41 0l-9 9c-.39.39-.39 1.02 0 1.41l9 9c.39.39 1.02.39 1.41 0l9-9c.39-.38.39-1.01 0-1.41zm-7.71 3.21v-2.5h-4v3h-2v-4c0-.55.45-1 1-1h5v-2.5l3.5 3.5-3.5 3.5z\"/></g>\n<g id=\"directions-bike\"><path d=\"M16 4.8c.99 0 1.8-.81 1.8-1.8s-.81-1.8-1.8-1.8c-1 0-1.8.81-1.8 1.8s.8 1.8 1.8 1.8zm3 7.2c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0 8.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5zm-4.2-10.5h4.2v-1.8h-3.2l-1.93-3.27c-.3-.5-.84-.83-1.46-.83-.47 0-.89.19-1.2.5l-3.7 3.7c-.32.3-.51.73-.51 1.2 0 .63.33 1.16.85 1.47l3.35 2.03v5h1.8v-6.48l-2.25-1.67 2.32-2.33 1.73 2.48zm-9.8 2c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0 8.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g>\n<g id=\"directions-bus\"><path d=\"M4 16c0 .88.39 1.67 1 2.22v1.78c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h8v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1.78c.61-.55 1-1.34 1-2.22v-10c0-3.5-3.58-4-8-4s-8 .5-8 4v10zm3.5 1c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm9 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-12v-5h12v5z\"/></g>\n<g id=\"directions-car\"><path d=\"M18.92 6.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"directions-ferry\"><path d=\"M20 21c-1.39 0-2.78-.47-4-1.32-2.44 1.71-5.56 1.71-8 0-1.22.85-2.61 1.32-4 1.32h-2v2h2c1.38 0 2.74-.35 4-.99 2.52 1.29 5.48 1.29 8 0 1.26.65 2.62.99 4 .99h2v-2h-2zm-16.05-2h.05c1.6 0 3.02-.88 4-2 .98 1.12 2.4 2 4 2s3.02-.88 4-2c.98 1.12 2.4 2 4 2h.05l1.89-6.68c.08-.26.06-.54-.06-.78s-.34-.42-.6-.5l-1.28-.42v-4.62c0-1.1-.9-2-2-2h-3v-3h-6v3h-3c-1.1 0-2 .9-2 2v4.62l-1.29.42c-.26.08-.48.26-.6.5s-.15.52-.06.78l1.9 6.68zm2.05-13h12v3.97l-6-1.97-6 1.97v-3.97z\"/></g>\n<g id=\"directions-subway\"><path d=\"M12 2c-4.42 0-8 .5-8 4v9.5c0 1.93 1.57 3.5 3.5 3.5l-1.5 1.5v.5h12v-.5l-1.5-1.5c1.93 0 3.5-1.57 3.5-3.5v-9.5c0-3.5-3.58-4-8-4zm-4.5 15c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3.5-6h-5v-5h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5v-5h5v5z\"/></g>\n<g id=\"directions-train\"><path d=\"M4 15.5c0 1.93 1.57 3.5 3.5 3.5l-1.5 1.5v.5h12v-.5l-1.5-1.5c1.93 0 3.5-1.57 3.5-3.5v-10.5c0-3.5-3.58-4-8-4s-8 .5-8 4v10.5zm8 1.5c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm6-7h-12v-5h12v5z\"/></g>\n<g id=\"directions-transit\"><path d=\"M12 2c-4.42 0-8 .5-8 4v9.5c0 1.93 1.57 3.5 3.5 3.5l-1.5 1.5v.5h12v-.5l-1.5-1.5c1.93 0 3.5-1.57 3.5-3.5v-9.5c0-3.5-3.58-4-8-4zm-4.5 15c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3.5-6h-5v-5h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5v-5h5v5z\"/></g>\n<g id=\"directions-walk\"><path d=\"M14 3.8c.99 0 1.8-.81 1.8-1.8 0-1-.81-1.8-1.8-1.8-1 0-1.8.81-1.8 1.8s.8 1.8 1.8 1.8zm.12 6.2h4.88v-1.8h-3.62l-2-3.33c-.3-.5-.84-.83-1.46-.83-.17 0-.34.03-.49.07l-5.43 1.69v5.2h1.8v-3.67l2.11-.66-3.91 15.33h1.8l2.87-8.11 2.33 3.11v5h1.8v-6.41l-2.49-4.54.73-2.87 1.08 1.82z\"/></g>\n<g id=\"earth\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18.2c-1.12 0-2.19-.23-3.17-.64-.62-1.48-.61-2.64 1.12-2.06 0 0 3.92 1.52 8.04.08-1.49 1.61-3.62 2.62-5.99 2.62zm7.1-4.1c-.94.37-2.11 1-3.96 1-1.88 0-3.53-.75-5.58-1.4-1.86-.59-2.55-1.5-3.84-1.5-.66 0-.98.66-1.17 1.22-.47-1.04-.75-2.2-.75-3.42 0-.8.12-1.58.34-2.31 1.26-1.59 3.19-2.57 5.95-.43 0 0 6.23 4.67 9.79 4.97-.18.66-.45 1.29-.78 1.87zm-6.7-8.54c-2.8-2.65-5.1-1.91-6.09-1.46.75-.72 1.63-1.3 2.6-1.7 2.78-.1 5.91.44 7.65 2.91 0 0 2.42 4.18 3.29 2.34.22.74.34 1.53.34 2.34 0 .3-.02.59-.05.88-2.02-.22-4.81-2.54-7.74-5.31z\"/></g>\n<g id=\"explore-nearby\"><path d=\"M12 7.2c-2.1 0-3.8 1.7-3.8 3.8 0 3 3.8 6.5 3.8 6.5s3.8-3.5 3.8-6.5c0-2.1-1.7-3.8-3.8-3.8zm0 5.3c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm0-10.5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"flight\"><path d=\"M10.18 9\"/><path d=\"M21 16v-2l-8-5v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z\"/></g>\n<g id=\"hotel\"><path d=\"M7 13c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7h-8v-9h-2v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z\"/></g>\n<g id=\"layers\"><path d=\"M11.99 18.54l-7.37-5.73-1.62 1.26 9 7 9-7-1.63-1.27-7.38 5.74zm.01-2.54l7.36-5.73 1.64-1.27-9-7-9 7 1.63 1.27 7.37 5.73z\"/></g>\n<g id=\"layers-clear\"><path d=\"M19.81 14.99l1.19-.92-1.43-1.43-1.19.92 1.43 1.43zm-.45-4.72l1.64-1.27-9-7-2.91 2.27 7.87 7.88 2.4-1.88zm-16.09-9.27l-1.27 1.27 4.22 4.22-3.22 2.51 1.63 1.27 7.37 5.73 2.1-1.63 1.43 1.43-3.53 2.74-7.37-5.73-1.63 1.26 9 7 4.95-3.85 3.78 3.78 1.27-1.27-18.73-18.73z\"/></g>\n<g id=\"local-airport\"><path d=\"M21 16v-2l-8-5v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z\"/></g>\n<g id=\"local-atm\"><path d=\"M11 17h2v-1h1c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1h-3v-1h4v-2h-2v-1h-2v1h-1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1h3v1h-4v2h2v1zm9-13h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-12h16v12z\"/></g>\n<g id=\"local-attraction\"><path d=\"M20 12c0-1.1.9-2 2-2v-4c0-1.1-.9-2-2-2h-16c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8l-3.58-2.3-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25 1.55-3.94 1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z\"/></g>\n<g id=\"local-bar\"><path d=\"M11 13v6h-5v2h12v-2h-5v-6l8-8v-2h-18v2l8 8zm-3.5-6l-2-2h13l-2 2h-9z\"/></g>\n<g id=\"local-cafe\"><path d=\"M20 3h-16v10c0 2.21 1.79 4 4 4h6c2.21 0 4-1.79 4-4v-3h2c1.11 0 2-.89 2-2v-3c0-1.11-.89-2-2-2zm0 5h-2v-3h2v3zm-18 13h18v-2h-18v2z\"/></g>\n<g id=\"local-car-wash\"><path d=\"M17 5c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm-5 0c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm-5 0c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm11.92 3.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"local-convenience-store\"><path d=\"M19 7v-3h-14v3h-3v13h8v-4h4v4h8v-13h-3zm-8 3h-2v1h2v1h-3v-3h2v-1h-2v-1h3v3zm5 2h-1v-2h-2v-3h1v2h1v-2h1v5z\"/></g>\n<g id=\"local-drink\"><path d=\"M3 2l2.01 18.23c.12 1 .96 1.77 1.99 1.77h10c1.03 0 1.87-.77 1.99-1.77l2.01-18.23h-18zm9 17c-1.66 0-3-1.34-3-3 0-2 3-5.4 3-5.4s3 3.4 3 5.4c0 1.66-1.34 3-3 3zm6.33-11h-12.66l-.44-4h13.53l-.43 4z\"/></g>\n<g id=\"local-florist\"><path d=\"M12 22c4.97 0 9-4.03 9-9-4.97 0-9 4.03-9 9zm-6.4-11.75c0 1.38 1.12 2.5 2.5 2.5.53 0 1.01-.16 1.42-.44l-.02.19c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5l-.02-.19c.4.28.89.44 1.42.44 1.38 0 2.5-1.12 2.5-2.5 0-1-.59-1.85-1.43-2.25.84-.4 1.43-1.25 1.43-2.25 0-1.38-1.12-2.5-2.5-2.5-.53 0-1.01.16-1.42.44l.02-.19c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5l.02.19c-.4-.28-.89-.44-1.42-.44-1.38 0-2.5 1.12-2.5 2.5 0 1 .59 1.85 1.43 2.25-.84.4-1.43 1.25-1.43 2.25zm6.4-4.75c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5-2.5-1.12-2.5-2.5 1.12-2.5 2.5-2.5zm-9 7.5c0 4.97 4.03 9 9 9 0-4.97-4.03-9-9-9z\"/></g>\n<g id=\"local-gas-station\"><path d=\"M19.77 7.23l.01-.01-3.72-3.72-1.06 1.06 2.11 2.11c-.94.36-1.61 1.26-1.61 2.33 0 1.38 1.12 2.5 2.5 2.5.36 0 .69-.08 1-.21v7.21c0 .55-.45 1-1 1s-1-.45-1-1v-4.5c0-1.1-.9-2-2-2h-1v-7c0-1.1-.9-2-2-2h-6c-1.1 0-2 .9-2 2v16h10v-7.5h1.5v5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5v-9.5c0-.69-.28-1.32-.73-1.77zm-7.77 2.77h-6v-5h6v5zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"local-grocery-store\"><path d=\"M7 18c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-6-16v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1h-14.79l-.94-2h-3.27zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"local-hospital\"><path d=\"M19 3h-14c-1.1 0-1.99.9-1.99 2l-.01 14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-1 11h-4v4h-4v-4h-4v-4h4v-4h4v4h4v4z\"/></g>\n<g id=\"local-hotel\"><path d=\"M7 13c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7h-8v-9h-2v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z\"/></g>\n<g id=\"local-laundry-service\"><path d=\"M9.17 16.83c1.56 1.56 4.1 1.56 5.66 0 1.56-1.56 1.56-4.1 0-5.66l-5.66 5.66zm8.83-14.82l-12-.01c-1.11 0-2 .89-2 2v16c0 1.11.89 2 2 2h12c1.11 0 2-.89 2-2v-16c0-1.11-.89-1.99-2-1.99zm-8 1.99c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-3 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm5 16c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z\"/></g>\n<g id=\"local-library\"><path d=\"M12 11.55c-2.36-2.2-5.52-3.55-9-3.55v11c3.48 0 6.64 1.35 9 3.55 2.36-2.19 5.52-3.55 9-3.55v-11c-3.48 0-6.64 1.35-9 3.55zm0-3.55c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z\"/></g>\n<g id=\"local-mall\"><path d=\"M19 6h-2c0-2.76-2.24-5-5-5s-5 2.24-5 5h-2c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7-3c1.66 0 3 1.34 3 3h-6c0-1.66 1.34-3 3-3zm0 10c-2.76 0-5-2.24-5-5h2c0 1.66 1.34 3 3 3s3-1.34 3-3h2c0 2.76-2.24 5-5 5z\"/></g>\n<g id=\"local-movies\"><path d=\"M18 3v2h-2v-2h-8v2h-2v-2h-2v18h2v-2h2v2h8v-2h2v2h2v-18h-2zm-10 14h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g>\n<g id=\"local-offer\"><path d=\"M21.41 11.58l-9-9c-.36-.36-.86-.58-1.41-.58h-7c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zm-15.91-4.58c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"local-parking\"><path d=\"M13 3h-7v18h4v-6h3c3.31 0 6-2.69 6-6s-2.69-6-6-6zm.2 8h-3.2v-4h3.2c1.1 0 2 .9 2 2s-.9 2-2 2z\"/></g>\n<g id=\"local-pharmacy\"><path d=\"M21 5h-2.64l1.14-3.14-2.35-.86-1.46 4h-12.69v2l2 6-2 6v2h18v-2l-2-6 2-6v-2zm-5 9h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2z\"/></g>\n<g id=\"local-phone\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1v3.49c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/></g>\n<g id=\"local-pizza\"><path d=\"M12 2c-3.57 0-6.77 1.54-8.99 4l8.99 16 8.99-16c-2.21-2.45-5.42-4-8.99-4zm-5 5c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2zm5 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"local-play\"><path d=\"M20 12c0-1.1.9-2 2-2v-4c0-1.1-.9-2-2-2h-16c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8l-3.58-2.3-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25 1.55-3.94 1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z\"/></g>\n<g id=\"local-post-office\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"local-print-shop\"><path d=\"M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11h-8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9h-12v4h12v-4z\"/></g>\n<g id=\"local-restaurant\"><path d=\"M8.1 13.34l2.83-2.83-7.02-7.01c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27l-9.76 9.76 1.41 1.41 6.89-6.87 6.88 6.88 1.41-1.41-6.88-6.88 1.47-1.47z\"/></g>\n<g id=\"local-see\"><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2h-3.17l-1.83-2h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></g>\n<g id=\"local-shipping\"><path d=\"M20 8h-3v-4h-14c-1.1 0-2 .9-2 2v11h2c0 1.66 1.34 3 3 3s3-1.34 3-3h6c0 1.66 1.34 3 3 3s3-1.34 3-3h2v-5l-3-4zm-14 10.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm13.5-9l1.96 2.5h-4.46v-2.5h2.5zm-1.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"local-taxi\"><path d=\"M18.92 6.01c-.2-.59-.76-1.01-1.42-1.01h-2.5v-2h-6v2h-2.5c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"location-history\"><path d=\"M19 2h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 3.3c1.49 0 2.7 1.21 2.7 2.7 0 1.49-1.21 2.7-2.7 2.7-1.49 0-2.7-1.21-2.7-2.7 0-1.49 1.21-2.7 2.7-2.7zm6 10.7h-12v-.9c0-2 4-3.1 6-3.1s6 1.1 6 3.1v.9z\"/></g>\n<g id=\"map\"><path d=\"M20.5 3l-.16.03-5.34 2.07-6-2.1-5.64 1.9c-.21.07-.36.25-.36.48v15.12c0 .28.22.5.5.5l.16-.03 5.34-2.07 6 2.1 5.64-1.9c.21-.07.36-.25.36-.48v-15.12c0-.28-.22-.5-.5-.5zm-5.5 16l-6-2.11v-11.89l6 2.11v11.89z\"/></g>\n<g id=\"my-location\"><path d=\"M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"navigation\"><path d=\"M12 2l-7.5 18.29.71.71 6.79-3 6.79 3 .71-.71z\"/></g>\n<g id=\"pin-drop\"><path d=\"M18 8c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 4.5 6 11 6 11s6-6.5 6-11zm-8 0c0-1.1.9-2 2-2s2 .9 2 2-.89 2-2 2c-1.1 0-2-.9-2-2zm-5 12v2h14v-2h-14z\"/></g>\n<g id=\"place\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"rate-review\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-14 12v-2.47l6.88-6.88c.2-.2.51-.2.71 0l1.77 1.77c.2.2.2.51 0 .71l-6.89 6.87h-2.47zm12 0h-7.5l2-2h5.5v2z\"/></g>\n<g id=\"restaurant-menu\"><path d=\"M8.1 13.34l2.83-2.83-7.02-7.01c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27l-9.76 9.76 1.41 1.41 6.89-6.87 6.88 6.88 1.41-1.41-6.88-6.88 1.47-1.47z\"/></g>\n<g id=\"satellite\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-14 1.99h3c0 1.66-1.34 3.01-3 3.01v-3.01zm0 7.01v-2c2.76 0 5-2.25 5-5.01h2c0 3.87-3.13 7.01-7 7.01zm0 6l3.5-4.5 2.5 3.01 3.5-4.51 4.5 6h-14z\"/></g>\n<g id=\"store-mall-directory\"><path d=\"M20 4h-16v2h16v-2zm1 10v-2l-1-5h-16l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4h-6v-4h6v4z\"/></g>\n<g id=\"terrain\"><path d=\"M14 6l-3.75 5 2.85 3.8-1.6 1.2c-1.69-2.25-4.5-6-4.5-6l-6 8h22l-9-12z\"/></g>\n<g id=\"traffic\"><path d=\"M20 10h-3v-1.14c1.72-.45 3-2 3-3.86h-3v-1c0-.55-.45-1-1-1h-8c-.55 0-1 .45-1 1v1h-3c0 1.86 1.28 3.41 3 3.86v1.14h-3c0 1.86 1.28 3.41 3 3.86v1.14h-3c0 1.86 1.28 3.41 3 3.86v1.14c0 .55.45 1 1 1h8c.55 0 1-.45 1-1v-1.14c1.72-.45 3-2 3-3.86h-3v-1.14c1.72-.45 3-2 3-3.86zm-8 9c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2 0-1.11.89-2 2-2 1.1 0 2 .89 2 2 0 1.1-.89 2-2 2z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/notification-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"notification\" iconSize=\"24\">\n<svg><defs>\n<g id=\"adb\"><path d=\"M5 16c0 3.87 3.13 7 7 7s7-3.13 7-7v-4h-14v4zm11.12-11.63l2.1-2.1-.82-.83-2.3 2.31c-.94-.47-1.98-.75-3.1-.75s-2.16.28-3.09.75l-2.31-2.31-.82.83 2.1 2.1c-1.74 1.27-2.88 3.31-2.88 5.63v1h14v-1c0-2.32-1.14-4.36-2.88-5.63zm-7.12 4.63c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"bluetooth-audio\"><path d=\"M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"disc-full\"><path d=\"M20 16h2v-2h-2v2zm0-9v5h2v-5h-2zm-10-3c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm0 10c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"dnd-forwardslash\"><path d=\"M12 2c-5.5 0-10 4.5-10 10s4.5 10 10 10 10-4.5 10-10-4.5-10-10-10zm-8 10c0-4.4 3.6-8 8-8 1.8 0 3.5.6 4.9 1.7l-11.2 11.2c-1.1-1.4-1.7-3.1-1.7-4.9zm8 8c-1.8 0-3.5-.6-4.9-1.7l11.2-11.2c1.1 1.4 1.7 3.1 1.7 4.9 0 4.4-3.6 8-8 8z\"/></g>\n<g id=\"do-not-disturb\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9l11.21 11.21c-1.35 1.06-3.05 1.69-4.9 1.69zm6.31-3.1l-11.21-11.21c1.35-1.06 3.05-1.69 4.9-1.69 4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z\"/></g>\n<g id=\"drive-eta\"><path d=\"M18.92 5.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"event-available\"><path d=\"M16.53 11.06l-1.06-1.06-4.88 4.88-2.12-2.12-1.06 1.06 3.18 3.18 5.94-5.94zm2.47-8.06h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11z\"/></g>\n<g id=\"event-busy\"><path d=\"M9.31 17l2.44-2.44 2.44 2.44 1.06-1.06-2.44-2.44 2.44-2.44-1.06-1.06-2.44 2.44-2.44-2.44-1.06 1.06 2.44 2.44-2.44 2.44 1.06 1.06zm9.69-14h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11z\"/></g>\n<g id=\"event-note\"><path d=\"M17 10h-10v2h10v-2zm2-7h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11zm-5-5h-7v2h7v-2z\"/></g>\n<g id=\"folder-special\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6.42 12l-3.58-2.1-3.58 2.1.95-4.07-3.16-2.74 4.16-.36 1.63-3.83 1.63 3.84 4.16.36-3.16 2.74.95 4.06z\"/></g>\n<g id=\"mms\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-15 12l3.5-4.5 2.5 3.01 3.5-4.51 4.5 6h-14z\"/></g>\n<g id=\"more\"><path d=\"M22 3h-15c-.69 0-1.23.35-1.59.88l-5.41 8.12 5.41 8.11c.36.53.97.89 1.66.89h14.93c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-13 10.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"network-locked\"><path d=\"M19.5 10c.17 0 .33.03.5.05v-9.05l-19 19h13v-3c0-.89.39-1.68 1-2.23v-.27c0-2.48 2.02-4.5 4.5-4.5zm2.5 6v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v1.5z\"/></g>\n<g id=\"phone-bluetooth-speaker\"><path d=\"M14.71 9.5l2.29-2.29v3.79h.5l2.85-2.85-2.14-2.15 2.15-2.15-2.86-2.85h-.5v3.79l-2.29-2.29-.71.71 2.79 2.79-2.79 2.79.71.71zm3.29-6.59l.94.94-.94.94v-1.88zm0 4.3l.94.94-.94.94v-1.88zm2 8.29c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z\"/></g>\n<g id=\"phone-forwarded\"><path d=\"M18 11l5-5-5-5v3h-4v4h4v3zm2 4.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z\"/></g>\n<g id=\"phone-in-talk\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-3.5h2c0-4.97-4.03-9-9-9v2c3.87 0 7 3.13 7 7zm-4 0h2c0-2.76-2.24-5-5-5v2c1.66 0 3 1.34 3 3z\"/></g>\n<g id=\"phone-locked\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm0-11.5v-.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7v.5z\"/></g>\n<g id=\"phone-missed\"><path d=\"M6.5 5.5l5.5 5.5 7-7-1-1-6 6-4.5-4.5h3.5v-1.5h-6v6h1.5v-3.5zm17.21 11.17c-3.05-2.89-7.17-4.67-11.71-4.67-4.54 0-8.66 1.78-11.71 4.67-.18.18-.29.43-.29.71s.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73 1.6 0 3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.67 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71s-.12-.52-.3-.7z\"/></g>\n<g id=\"phone-paused\"><path d=\"M17 3h-2v7h2v-7zm3 12.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-12.5v7h2v-7h-2z\"/></g>\n<g id=\"play-download\"><path d=\"M20 6h-4v-2l-2-2h-4l-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-10-2h4v2h-4v-2zm2 15l-5-5h3v-4h4v4h3l-5 5z\"/></g>\n<g id=\"play-install\"><path d=\"M20 6h-4v-2l-2-2h-4l-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-10-2h4v2h-4v-2zm.5 13.5l-3.5-3.5 1.41-1.41 2.09 2.09 5.18-5.18 1.41 1.41-6.59 6.59z\"/></g>\n<g id=\"sd-card\"><path d=\"M18 2h-8l-5.98 6-.02 12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-6 6h-2v-4h2v4zm3 0h-2v-4h2v4zm3 0h-2v-4h2v4z\"/></g>\n<g id=\"sim-card-alert\"><path d=\"M18 2h-8l-5.98 6-.02 12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-5 15h-2v-2h2v2zm0-4h-2v-5h2v5z\"/></g>\n<g id=\"sms\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-11 9h-2v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2z\"/></g>\n<g id=\"sms-failed\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g>\n<g id=\"sync\"><path d=\"M12 4v-3l-4 4 4 4v-3c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46c.78-1.23 1.24-2.69 1.24-4.26 0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8l-1.46-1.46c-.78 1.23-1.24 2.69-1.24 4.26 0 4.42 3.58 8 8 8v3l4-4-4-4v3z\"/></g>\n<g id=\"sync-disabled\"><path d=\"M10 6.35v-2.09c-.8.21-1.55.54-2.23.96l1.46 1.46c.25-.12.5-.24.77-.33zm-7.14-.94l2.36 2.36c-.77 1.22-1.22 2.67-1.22 4.23 0 2.21.91 4.2 2.36 5.64l-2.36 2.36h6v-6l-2.24 2.24c-1.08-1.09-1.76-2.58-1.76-4.24 0-1 .25-1.94.68-2.77l8.08 8.08c-.25.13-.5.25-.77.34v2.09c.8-.21 1.55-.54 2.23-.96l2.36 2.36 1.27-1.27-15.71-15.73-1.28 1.27zm17.14-1.41h-6v6l2.24-2.24c1.08 1.09 1.76 2.58 1.76 4.24 0 1-.25 1.94-.68 2.77l1.46 1.46c.77-1.22 1.22-2.67 1.22-4.23 0-2.21-.91-4.2-2.36-5.64l2.36-2.36z\"/></g>\n<g id=\"sync-problem\"><path d=\"M3 12c0 2.21.91 4.2 2.36 5.64l-2.36 2.36h6v-6l-2.24 2.24c-1.08-1.09-1.76-2.58-1.76-4.24 0-2.61 1.67-4.83 4-5.65v-2.09c-3.45.89-6 4.01-6 7.74zm8 5h2v-2h-2v2zm10-13h-6v6l2.24-2.24c1.08 1.09 1.76 2.58 1.76 4.24 0 2.61-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74 0-2.21-.91-4.2-2.36-5.64l2.36-2.36zm-10 9h2v-6h-2v6z\"/></g>\n<g id=\"system-update\"><path d=\"M17 1.01l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14zm-1-6h-3v-5h-2v5h-3l4 4 4-4z\"/></g>\n<g id=\"tap-and-play\"><path d=\"M2 16v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4v3h3c0-1.66-1.34-3-3-3zm0-8v2c4.97 0 9 4.03 9 9h2c0-6.08-4.92-11-11-11zm15-10.99l-10-.01c-1.1 0-2 .9-2 2v7.37c.69.16 1.36.37 2 .64v-6.01h10v13h-3.03c.52 1.25.84 2.59.95 4h2.08c1.1 0 2-.9 2-2v-17c0-1.1-.9-1.99-2-1.99z\"/></g>\n<g id=\"time-to-leave\"><path d=\"M18.92 5.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"vibration\"><path d=\"M0 15h2v-6h-2v6zm3 2h2v-10h-2v10zm19-8v6h2v-6h-2zm-3 8h2v-10h-2v10zm-2.5-14h-9c-.83 0-1.5.67-1.5 1.5v15c0 .83.67 1.5 1.5 1.5h9c.83 0 1.5-.67 1.5-1.5v-15c0-.83-.67-1.5-1.5-1.5zm-.5 16h-8v-14h8v14z\"/></g>\n<g id=\"voice-chat\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-2 12l-4-3.2v3.2h-8v-8h8v3.2l4-3.2v8z\"/></g>\n<g id=\"vpn-lock\"><path d=\"M22 4v-.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7v.5zm-2.28 8c.04.33.08.66.08 1 0 2.08-.8 3.97-2.1 5.39-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1h-6v-2h2c.55 0 1-.45 1-1v-2h2c1.1 0 2-.9 2-2v-2.54c-.95-.3-1.95-.46-3-.46-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10c0-.34-.02-.67-.05-1h-2.03zm-8.92 8.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79l4.79 4.79v1c0 1.1.9 2 2 2v1.93z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/png-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<core-iconset id=\"core-icons\" src=\"../core-action-icons/action-icons.png\" width=\"24\" iconSize=\"24\"\n    icons=\"drawer menu search dropdown close add trash refresh settings dialoga \n           left right down up grid contact account plus time marker \n           briefcase array columns list modules quilt stream maximize shrink sort \n           shortcut dialog twitter facebook favorite gplus filter tag plusone dots\">\n\n  <property theme=\"core-light-theme\" offsetX=\"24\"></property>\n  <property theme=\"core-dark-theme\" offsetX=\"72\"></property>\n</core-iconset>\n"
  },
  {
    "path": "build/mui/bower_components/core-icons/social-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"social\" iconSize=\"24\">\n<svg><defs>\n<g id=\"cake\"><path d=\"M12 7c1.1 0 2-.9 2-2 0-.38-.1-.73-.29-1.03l-1.71-2.97-1.71 2.97c-.19.3-.29.65-.29 1.03 0 1.1.9 2 2 2zm9 14v-4c0-1.1-.9-2-2-2h-1v-3c0-1.1-.9-2-2-2h-3v-2h-2v2h-3c-1.1 0-2 .9-2 2v3h-1c-1.1 0-2 .9-2 2v4h-2v2h22v-2h-2z\"/></g>\n<g id=\"circles\"><path d=\"M16.66 14.98c-.82 2.34-3.04 4.02-5.66 4.02-3.31 0-6-2.69-6-6 0-2.62 1.68-4.84 4.02-5.66l-.02-.34c0-1.01.2-1.98.54-2.87-4.27.7-7.54 4.4-7.54 8.87 0 4.97 4.03 9 9 9 4.47 0 8.17-3.27 8.87-7.54-.89.34-1.86.54-2.87.54l-.34-.02zm.34-13.98c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 9c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z\"/></g>\n<g id=\"circles-add\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M13 11v-3h-2v3h-3v2h3v3h2v-3h3v-2h-3z\"/></g>\n<g id=\"circles-extended\"><path d=\"M12 10c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0-6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm-6 9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm6-7.9c-1.05 0-1.9.85-1.9 1.9s.85 1.9 1.9 1.9c1.05 0 1.9-.85 1.9-1.9s-.85-1.9-1.9-1.9zm6 1.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"communities\"><path d=\"M9 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5-3c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-7c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"domain\"><path d=\"M12 7v-4h-10v18h20v-14h-10zm-6 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm4 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2v-2h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\"/></g>\n<g id=\"group\"><path d=\"M16 11c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5v2.5h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45v2.5h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"/></g>\n<g id=\"group-add\"><path d=\"M8 10h-3v-3h-2v3h-3v2h3v3h2v-3h3v-2zm10 1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-.32 0-.63.05-.91.14.57.81.9 1.79.9 2.86s-.34 2.04-.9 2.86c.28.09.59.14.91.14zm-5 0c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm6.62 2.16c.83.73 1.38 1.66 1.38 2.84v2h3v-2c0-1.54-2.37-2.49-4.38-2.84zm-6.62-.16c-2 0-6 1-6 3v2h12v-2c0-2-4-3-6-3z\"/></g>\n<g id=\"location-city\"><path d=\"M15 11v-6l-3-3-3 3v2h-6v14h18v-10h-6zm-8 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm6 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm6 12h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g>\n<g id=\"mood\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5h-10.22c.8 2.04 2.78 3.5 5.11 3.5z\"/></g>\n<g id=\"notifications\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-6v-5.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2z\"/></g>\n<g id=\"notifications-none\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-6v-5.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2zm-2 1h-9v-6.5c0-2.49 2.01-4.5 4.5-4.5s4.5 2.01 4.5 4.5v6.5z\"/></g>\n<g id=\"notifications-off\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-11.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.51.12-.99.32-1.45.56l9.45 9.44v-3.68zm-.27 8.5l2 2 1.27-1.27-16.73-16.73-1.27 1.27 2.92 2.92c-.58.97-.92 2.1-.92 3.31v5.5l-2 2v1h14.73z\"/></g>\n<g id=\"notifications-on\"><path d=\"M6.58 3.58l-1.43-1.43c-2.39 1.82-3.97 4.65-4.12 7.85h2c.15-2.65 1.51-4.97 3.55-6.42zm13.39 6.42h2c-.15-3.2-1.73-6.03-4.13-7.85l-1.43 1.43c2.05 1.45 3.41 3.77 3.56 6.42zm-1.97.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2v-5.5zm-6.5 11.5c.14 0 .27-.01.4-.04.65-.13 1.19-.58 1.44-1.18.1-.24.16-.5.16-.78h-4c0 1.1.9 2 2 2z\"/></g>\n<g id=\"notifications-paused\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-6v-5.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2zm-4-6.2l-2.8 3.4h2.8v1.8h-5v-1.8l2.8-3.4h-2.8v-1.8h5v1.8z\"/></g>\n<g id=\"pages\"><path d=\"M3 5v6h5l-1-4 4 1v-5h-6c-1.1 0-2 .9-2 2zm5 8h-5v6c0 1.1.9 2 2 2h6v-5l-4 1 1-4zm9 4l-4-1v5h6c1.1 0 2-.9 2-2v-6h-5l1 4zm2-14h-6v5l4-1-1 4h5v-6c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"party-mode\"><path d=\"M20 4h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-8 3c1.63 0 3.06.79 3.98 2h-3.98c-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.08c-.06-.32-.1-.66-.1-1 0-2.76 2.24-5 5-5zm0 10c-1.63 0-3.06-.79-3.98-2h3.98c1.66 0 3-1.34 3-3 0-.35-.07-.69-.18-1h2.08c.07.32.1.66.1 1 0 2.76-2.24 5-5 5z\"/></g>\n<g id=\"people\"><path d=\"M16 11c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5v2.5h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45v2.5h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"/></g>\n<g id=\"people-outline\"><path d=\"M16.5 13c-1.2 0-3.07.34-4.5 1-1.43-.67-3.3-1-4.5-1-2.17 0-6.5 1.08-6.5 3.25v2.75h22v-2.75c0-2.17-4.33-3.25-6.5-3.25zm-4 4.5h-10v-1.25c0-.54 2.56-1.75 5-1.75s5 1.21 5 1.75v1.25zm9 0h-7.5v-1.25c0-.46-.2-.86-.52-1.22.88-.3 1.96-.53 3.02-.53 2.44 0 5 1.21 5 1.75v1.25zm-14-5.5c1.93 0 3.5-1.57 3.5-3.5s-1.57-3.5-3.5-3.5-3.5 1.57-3.5 3.5 1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 5.5c1.93 0 3.5-1.57 3.5-3.5s-1.57-3.5-3.5-3.5-3.5 1.57-3.5 3.5 1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z\"/></g>\n<g id=\"person\"><path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"person-add\"><path d=\"M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2v-3h-2v3h-3v2h3v3h2v-3h3v-2h-3zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"person-outline\"><path d=\"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1-2.1-.94-2.1-2.1.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1h-12.2v-1.1c0-.64 3.13-2.1 6.1-2.1m0-10.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"plus-one\"><path d=\"M10 8h-2v4h-4v2h4v4h2v-4h4v-2h-4zm4.5-1.92v1.82l2.5-.5v10.6h2v-13z\"/></g>\n<g id=\"poll\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g>\n<g id=\"post-blogger\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-4 7v1c0 .55.45 1 1 1s1 .45 1 1v3c0 1.66-1.34 3-3 3h-6c-1.66 0-3-1.34-3-3v-7c0-1.66 1.34-3 3-3h4c1.66 0 3 1.34 3 3v1zm-6.05 1h2.6c.55 0 1-.45 1-1s-.45-1-1-1h-2.6c-.55 0-1 .45-1 1s.45 1 1 1zm4.05 3h-4.05c-.55 0-1 .45-1 1s.45 1 1 1h4.05c.55 0 1-.45 1-1s-.45-1-1-1z\"/></g>\n<g id=\"post-facebook\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-1 2v3h-2c-.55 0-1 .45-1 1v2h3v3h-3v7h-3v-7h-2v-3h2v-2.5c0-1.93 1.57-3.5 3.5-3.5h2.5z\"/></g>\n+<g id=\"post-github\"><path d=\"M7.2 6.6h-.1c-.5 1.4-.2 2.3-.1 2.6-.6.7-1 1.6-1 2.6 0 3.8 2.4 4.6 4.6 4.9-.2 0-.6.2-.8.8-.4.2-1.8.7-2.6-.7 0 0-.5-.8-1.3-.9 0 0-.8 0-.1.5 0 0 .6.3.9 1.3 0 0 .5 1.7 3 1.1v3.1h5v-3.5c0-1-.4-1.5-.8-1.8 2.2-.2 4.6-1 4.6-4.8 0-1.1-.4-2-1-2.6.1-.3.4-1.2-.1-2.6 0 0-.8-.3-2.7 1-.8-.2-1.6-.3-2.5-.3-.8 0-1.7.1-2.5.3-1.4-1-2.2-1-2.6-1zm12.8 15.4h-16c-1.1 0-2-.9-2-2v-16c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2v16c0 1.1-.9 2-2 2z\"/></g>\n<g id=\"post-gplus\"><path d=\"M11.2 8.87c0-1.02-.63-3.02-2.08-3.02-.64 0-1.32.44-1.32 1.67 0 1.18.63 2.93 1.97 2.93.06.01 1.43-.01 1.43-1.58zm-.63 4.94l-.31-.01h-.02c-.26 0-1.15.05-1.82.27-.65.24-1.42.72-1.42 1.7 0 1.08 1.04 2.23 2.96 2.23 1.52 0 2.44-1 2.44-1.97 0-.77-.46-1.24-1.83-2.22zm9.43-11.81h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-10.93 17.2c-2.8 0-4.07-1.56-4.07-3.01 0-.45.14-1.59 1.48-2.39.77-.47 1.85-.78 3.14-.91-.19-.25-.34-.55-.34-.99 0-.16.02-.31.05-.46h-.38c-1.97 0-3.15-1.55-3.15-3.04 0-1.73 1.29-3.6 4.11-3.6h4.21l-.34.34-.71.71-.06.06h-.71c.41.42.9 1.12.9 2.16 0 1.4-.74 2.09-1.56 2.73-.16.12-.42.38-.42.72 0 .3.24.5.39.62.13.11.3.22.47.34.81.57 1.92 1.34 1.92 2.88 0 1.77-1.29 3.84-4.93 3.84zm9.93-7.2h-2v2h-1v-2h-2v-1h2v-2h1v2h2v1z\"/></g>\n<g id=\"post-instagram\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-8 6c2.21 0 4 1.79 4 4s-1.79 4-4 4-4-1.79-4-4 1.79-4 4-4zm-7.5 12c-.28 0-.5-.22-.5-.5v-8.5h2.09c-.05.33-.09.66-.09 1 0 3.31 2.69 6 6 6s6-2.69 6-6c0-.34-.04-.67-.09-1h2.09v8.5c0 .28-.22.5-.5.5h-15zm15.5-13.5c0 .28-.22.5-.5.5h-2c-.28 0-.5-.22-.5-.5v-2c0-.28.22-.5.5-.5h2c.28 0 .5.22.5.5v2z\"/></g>\n<g id=\"post-linkedin\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 17h-3v-9h3v9zm-1.5-10.69c-1 0-1.81-.81-1.81-1.81s.81-1.81 1.81-1.81 1.81.81 1.81 1.81-.81 1.81-1.81 1.81zm12.5 10.69h-3v-5.3c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.3h-3v-9h3v1.2c.52-.84 1.59-1.4 2.5-1.4 1.93 0 3.5 1.57 3.5 3.5v5.7z\"/></g>\n<g id=\"post-pinterest\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-7 14.2c-.8 0-1.57-.34-2.12-.92l-.95 3.2-.07.21-.03-.01c-.19.32-.54.52-.93.52-.61 0-1.1-.49-1.1-1.1l.01-.15h-.01l.05-.18 1.85-5.56s-.2-.61-.2-1.47c0-1.72.92-2.23 1.66-2.23.74 0 1.42.27 1.42 1.31 0 1.34-.89 2.03-.89 3 0 .74.6 1.34 1.34 1.34 2.33 0 3.16-1.76 3.16-3.41 0-2.18-1.88-3.95-4.2-3.95-2.32 0-4.2 1.77-4.2 3.95 0 .67.19 1.34.54 1.94.09.16.14.33.14.51 0 .55-.45 1-1 1-.36 0-.69-.19-.87-.5-.53-.9-.82-1.92-.82-2.96.02-3.27 2.8-5.94 6.22-5.94s6.2 2.67 6.2 5.95c0 2.63-1.63 5.45-5.2 5.45z\"/></g>\n<g id=\"post-tumblr\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-4 9h-3v3.9c0 .73.14 1.1 1.1 1.1h1.9v3s-1.03.1-2.1.1c-2.65 0-3.9-1.62-3.9-3.4v-4.7h-2v-2.8c2.41-.2 2.62-2.04 2.8-3.2h2.2v3h3v3z\"/></g>\n<g id=\"post-twitter\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-2.29 7.33c-.06 4.62-3.02 7.78-7.42 7.98-1.82.08-3.14-.5-4.28-1.23 1.34.21 3.01-.32 3.9-1.09-1.32-.13-2.1-.8-2.46-1.88.38.07.78.05 1.14-.03-1.19-.4-2.04-1.13-2.08-2.67.33.15.68.29 1.14.32-.9-.5-1.55-2.35-.8-3.57 1.32 1.45 2.91 2.63 5.52 2.79-.65-2.8 3.06-4.32 4.61-2.44.66-.13 1.19-.38 1.7-.65-.21.65-.62 1.1-1.12 1.47.54-.07 1.03-.21 1.44-.41-.25.53-.81 1.01-1.29 1.41z\"/></g>\n<g id=\"post-youtube\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-1.49 15.5c-.45.15-3.73.5-6.51.5-2.77 0-6.05-.35-6.5-.5-1.17-.39-1.5-2.8-1.5-5.5s.33-5.11 1.5-5.5c.45-.15 3.73-.5 6.5-.5 2.78 0 6.06.36 6.51.51 1.17.39 1.49 2.79 1.49 5.49s-.32 5.11-1.49 5.5zm-8.51-2l5.5-3.5-5.5-3.5v7z\"/></g>\n<g id=\"public\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79l4.79 4.79v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1h-6v-2h2c.55 0 1-.45 1-1v-2h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\"/></g>\n<g id=\"school\"><path d=\"M5 13.18v4l7 3.82 7-3.82v-4l-7 3.82-7-3.82zm7-10.18l-11 6 11 6 9-4.91v6.91h2v-8l-11-6z\"/></g>\n<g id=\"share\"><path d=\"M18 16.08c-.76 0-1.44.3-1.96.77l-7.13-4.15c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7l-7.05 4.11c-.54-.5-1.25-.81-2.04-.81-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z\"/></g>\n<g id=\"whatshot\"><path d=\"M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36c-2.02 2.4-3.23 5.51-3.23 8.89 0 4.42 3.58 8 8 8s8-3.58 8-8c0-5.39-2.59-10.2-6.5-13.33zm-1.79 18.33c-1.78 0-3.22-1.4-3.22-3.14 0-1.62 1.05-2.76 2.81-3.12 1.77-.36 3.6-1.21 4.62-2.58.39 1.29.59 2.65.59 4.04 0 2.65-2.15 4.8-4.8 4.8z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset/README.md",
    "content": "core-iconset\n============\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-iconset) for more information.\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset/bower.json",
    "content": "{\n  \"name\": \"core-iconset\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\",\n    \"core-meta\": \"Polymer/core-meta#^0.5.0\",\n    \"core-icon\": \"Polymer/core-icon#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "build/mui/bower_components/core-iconset/core-iconset.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<!--\n/**\n * @group Polymer Core Elements\n *\n * The `core-iconset` element allows users to define their own icon sets. \n * The `src` property specifies the url of the icon image. Multiple icons may\n * be included in this image and they may be organized into rows.\n * The `icons` property is a space separated list of names corresponding to the\n * icons. The names must be ordered as the icons are ordered in the icon image.\n * Icons are expected to be square and are the size specified by the `iconSize`\n * property. The `width` property corresponds to the width of the icon image \n * and must be specified if icons are arranged into multiple rows in the image.\n *\n * All `core-iconset` elements are available for use by other `core-iconset`\n * elements via a database keyed by id. Typically, an element author that wants\n * to support a set of custom icons uses a `core-iconset` to retrieve \n * and use another, user-defined iconset.\n *\n * Example:\n *\n *     <core-iconset id=\"my-icons\" src=\"my-icons.png\" width=\"96\" iconSize=\"24\"\n *         icons=\"location place starta stopb bus car train walk\">\n *     </core-iconset>\n *\n * This will automatically register the icon set \"my-icons\" to the iconset\n * database.  To use these icons from within another element, make a \n * `core-iconset` element and call the `byId` method to retrieve a\n * given iconset. To apply a particular icon to an element, use the \n * `applyIcon` method. For example:\n *\n *     iconset.applyIcon(iconNode, 'car');\n *\n * Themed icon sets are also supported. The `core-iconset` can contain child\n * `property` elements that specify a theme with an offsetX and offsetY of the\n * theme within the icon resource. For example.\n *\n *     <core-iconset id=\"my-icons\" src=\"my-icons.png\" width=\"96\" iconSize=\"24\"\n *         icons=\"location place starta stopb bus car train walk\">\n *       <property theme=\"special\" offsetX=\"256\" offsetY=\"24\"></property>\n *     </core-iconset>\n *\n * Then a themed icon can be applied like this:\n *\n *     iconset.applyIcon(iconNode, 'car', 'special');\n *\n * @element core-iconset\n * @extends core-meta\n * @homepage github.io\n */\n-->\n\n<link rel=\"import\" href=\"../core-meta/core-meta.html\">\n\n<polymer-element name=\"core-iconset\" extends=\"core-meta\" attributes=\"src width icons iconSize\">\n  \n  <script>\n  \n    Polymer('core-iconset', {\n  \n      /**\n       * The URL of the iconset image.\n       *\n       * @attribute src\n       * @type string\n       * @default ''\n       */\n      src: '',\n\n      /**\n       * The width of the iconset image. This must only be specified if the\n       * icons are arranged into separate rows inside the image.\n       *\n       * @attribute width\n       * @type number\n       * @default 0\n       */\n      width: 0,\n\n      /**\n       * A space separated list of names corresponding to icons in the iconset\n       * image file. This list must be ordered the same as the icon images\n       * in the image file.\n       *\n       * @attribute icons\n       * @type string\n       * @default ''\n       */\n      icons: '',\n\n      /**\n       * The size of an individual icon. Note that icons must be square.\n       *\n       * @attribute iconSize\n       * @type number\n       * @default 24\n       */\n      iconSize: 24,\n\n      /**\n       * The horizontal offset of the icon images in the inconset src image.\n       * This is typically used if the image resource contains additional images\n       * beside those intended for the iconset.\n       *\n       * @attribute offsetX\n       * @type number\n       * @default 0\n       */\n      offsetX: 0,\n      /**\n       * The vertical offset of the icon images in the inconset src image.\n       * This is typically used if the image resource contains additional images\n       * beside those intended for the iconset.\n       *\n       * @attribute offsetY\n       * @type number\n       * @default 0\n       */\n      offsetY: 0,\n      type: 'iconset',\n\n      created: function() {\n        this.iconMap = {};\n        this.iconNames = [];\n        this.themes = {};\n      },\n  \n      ready: function() {\n        // TODO(sorvell): ensure iconset's src is always relative to the main\n        // document\n        if (this.src && (this.ownerDocument !== document)) {\n          this.src = this.resolvePath(this.src, this.ownerDocument.baseURI);\n        }\n        this.super();\n        this.updateThemes();\n      },\n\n      iconsChanged: function() {\n        var ox = this.offsetX;\n        var oy = this.offsetY;\n        this.icons && this.icons.split(/\\s+/g).forEach(function(name, i) {\n          this.iconNames.push(name);\n          this.iconMap[name] = {\n            offsetX: ox,\n            offsetY: oy\n          }\n          if (ox + this.iconSize < this.width) {\n            ox += this.iconSize;\n          } else {\n            ox = this.offsetX;\n            oy += this.iconSize;\n          }\n        }, this);\n      },\n\n      updateThemes: function() {\n        var ts = this.querySelectorAll('property[theme]');\n        ts && ts.array().forEach(function(t) {\n          this.themes[t.getAttribute('theme')] = {\n            offsetX: parseInt(t.getAttribute('offsetX')) || 0,\n            offsetY: parseInt(t.getAttribute('offsetY')) || 0\n          };\n        }, this);\n      },\n\n      // TODO(ffu): support retrived by index e.g. getOffset(10);\n      /**\n       * Returns an object containing `offsetX` and `offsetY` properties which\n       * specify the pixel locaion in the iconset's src file for the given\n       * `icon` and `theme`. It's uncommon to call this method. It is useful,\n       * for example, to manually position a css backgroundImage to the proper\n       * offset. It's more common to use the `applyIcon` method.\n       *\n       * @method getOffset\n       * @param {String|Number} icon The name of the icon or the index of the\n       * icon within in the icon image.\n       * @param {String} theme The name of the theme.\n       * @returns {Object} An object specifying the offset of the given icon \n       * within the icon resource file; `offsetX` is the horizontal offset and\n       * `offsetY` is the vertical offset. Both values are in pixel units.\n       */\n      getOffset: function(icon, theme) {\n        var i = this.iconMap[icon];\n        if (!i) {\n          var n = this.iconNames[Number(icon)];\n          i = this.iconMap[n];\n        }\n        var t = this.themes[theme];\n        if (i && t) {\n          return {\n            offsetX: i.offsetX + t.offsetX,\n            offsetY: i.offsetY + t.offsetY\n          }\n        }\n        return i;\n      },\n\n      /**\n       * Applies an icon to the given element as a css background image. This\n       * method does not size the element, and it's often necessary to set \n       * the element's height and width so that the background image is visible.\n       *\n       * @method applyIcon\n       * @param {Element} element The element to which the background is\n       * applied.\n       * @param {String|Number} icon The name or index of the icon to apply.\n       * @param {Number} scale (optional, defaults to 1) A scaling factor \n       * with which the icon can be magnified.\n       * @return {Element} The icon element.\n       */\n      applyIcon: function(element, icon, scale) {\n        var offset = this.getOffset(icon);\n        scale = scale || 1;\n        if (element && offset) {\n          var icon = element._icon || document.createElement('div');\n          var style = icon.style;\n          style.backgroundImage = 'url(' + this.src + ')';\n          style.backgroundPosition = (-offset.offsetX * scale + 'px') + \n             ' ' + (-offset.offsetY * scale + 'px');\n          style.backgroundSize = scale === 1 ? 'auto' :\n             this.width * scale + 'px';\n          if (icon.parentNode !== element) {\n            element.appendChild(icon);\n          }\n          return icon;\n        }\n      }\n\n    });\n\n  </script>\n\n</polymer-element>\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<html>\n<head>\n\n  <title>core-iconset</title>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"core-iconset.html\">\n  <link rel=\"import\" href=\"../core-icon/core-icon.html\">\n\n</head>\n<body unresolved>\n  \n  <!-- Register an icon set; you can do this anywhere, including an HTMLImport! -->\n  <core-iconset id=\"my-icons\" src=\"my-icons.png\" width=\"96\" iconSize=\"24\"\n      icons=\"location place starta stopb bus car train walk\">\n  </core-iconset>\n\n  <core-iconset id=\"my-icons-big\" src=\"my-icons-big.png\" width=\"192\" iconSize=\"48\"\n      icons=\"location place starta stopb bus car train walk\">\n  </core-iconset>\n\n  <!-- Now create a bunch of icons using our iconset -->\n  <core-icon icon=\"my-icons:location\"></core-icon>\n  <core-icon icon=\"my-icons:place\"></core-icon>\n  <core-icon icon=\"my-icons:starta\"></core-icon>\n  <core-icon icon=\"my-icons:stopb\"></core-icon>\n  <core-icon icon=\"my-icons:bus\"></core-icon>\n  <core-icon icon=\"my-icons:car\"></core-icon>\n  <core-icon icon=\"my-icons:train\"></core-icon>\n  <core-icon icon=\"my-icons:walk\"></core-icon>\n  <br>\n  <!-- icons may also be specified by index -->\n  <style>\n    .embiggen core-icon {\n      width: 48px;\n      height: 48px;\n    }\n  </style>\n\n  <div class=\"embiggen\">\n    <core-icon icon=\"my-icons-big:0\"></core-icon>\n    <core-icon icon=\"my-icons-big:1\"></core-icon>\n    <core-icon icon=\"my-icons-big:2\"></core-icon>\n    <core-icon icon=\"my-icons-big:3\"></core-icon>\n    <core-icon icon=\"my-icons-big:4\"></core-icon>\n    <core-icon icon=\"my-icons-big:5\"></core-icon>\n    <core-icon icon=\"my-icons-big:6\"></core-icon>\n    <core-icon icon=\"my-icons-big:7\"></core-icon>\n  </div>\n\n </body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset-svg/README.md",
    "content": "core-iconset-svg\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-iconset-svg) for more information.\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset-svg/bower.json",
    "content": "{\n  \"name\": \"core-iconset-svg\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\",\n    \"core-iconset\": \"Polymer/core-iconset#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "build/mui/bower_components/core-iconset-svg/core-iconset-svg.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<!--\n/**\n * @group Polymer Core Elements\n *\n * The `core-iconset-svg` element allows users to define their own icon sets\n * that contain svg icons. The svg icon elements should be children of the\n * `core-iconset-svg` element. Multiple icons should be given distinct id's.\n *\n * Using svg elements to create icons has a few advantages over traditional\n * bitmap graphics like jpg or png. Icons that use svg are vector based so they\n * are resolution independent and should look good on any device. They are\n * stylable via css. Icons can be themed, colorized, and even animated.\n *\n * Example:\n *\n *     <core-iconset-svg id=\"my-svg-icons\" iconSize=\"24\">\n *       <svg>\n *         <defs>\n *           <g id=\"shape\">\n *             <rect x=\"50\" y=\"50\" width=\"50\" height=\"50\" />\n *             <circle cx=\"50\" cy=\"50\" r=\"50\" />\n *           </g>\n *         </defs>\n *       </svg>\n *     </core-iconset-svg>\n *\n * This will automatically register the icon set \"my-svg-icons\" to the iconset\n * database.  To use these icons from within another element, make a\n * `core-iconset` element and call the `byId` method\n * to retrieve a given iconset. To apply a particular icon inside an\n * element use the `applyIcon` method. For example:\n *\n *     iconset.applyIcon(iconNode, 'car');\n *\n * @element core-iconset-svg\n * @extends core-meta\n * @homepage github.io\n */\n-->\n\n<link rel=\"import\" href=\"../core-iconset/core-iconset.html\">\n\n<polymer-element name=\"core-iconset-svg\" extends=\"core-meta\" attributes=\"iconSize\">\n\n  <script>\n\n    Polymer('core-iconset-svg', {\n\n\n      /**\n       * The size of an individual icon. Note that icons must be square.\n       *\n       * @attribute iconSize\n       * @type number\n       * @default 24\n       */\n      iconSize: 24,\n      type: 'iconset',\n\n      created: function() {\n        this._icons = {};\n      },\n\n      ready: function() {\n        this.super();\n        this.updateIcons();\n      },\n\n      iconById: function(id) {\n        return this._icons[id] || (this._icons[id] = this.querySelector('[id=\"' + id +'\"]'));\n      },\n\n      cloneIcon: function(id) {\n        var icon = this.iconById(id);\n        if (icon) {\n          var content = icon.cloneNode(true);\n          content.removeAttribute('id');\n          var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n          svg.setAttribute('viewBox', '0 0 ' + this.iconSize + ' ' +\n              this.iconSize);\n          // NOTE(dfreedm): work around https://crbug.com/370136\n          svg.style.pointerEvents = 'none';\n          svg.appendChild(content);\n          return svg;\n        }\n      },\n\n      get iconNames() {\n        if (!this._iconNames) {\n          this._iconNames = this.findIconNames();\n        }\n        return this._iconNames;\n      },\n\n      findIconNames: function() {\n        var icons = this.querySelectorAll('[id]').array();\n        if (icons.length) {\n          return icons.map(function(n){ return n.id });\n        }\n      },\n\n      /**\n       * Applies an icon to the given element. The svg icon is added to the\n       * element's shadowRoot if one exists or directly to itself.\n       *\n       * @method applyIcon\n       * @param {Element} element The element to which the icon is\n       * applied.\n       * @param {String|Number} icon The name the icon to apply.\n       * @return {Element} The icon element\n       */\n      applyIcon: function(element, icon) {\n        var root = element;\n        // remove old\n        var old = root.querySelector('svg');\n        if (old) {\n          old.remove();\n        }\n        // install new\n        var svg = this.cloneIcon(icon);\n        if (!svg) {\n          return;\n        }\n        svg.setAttribute('height', '100%');\n        svg.setAttribute('width', '100%');\n        svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n        svg.style.display = 'block';\n        root.insertBefore(svg, root.firstElementChild);\n        return svg;\n      },\n      \n      /**\n       * Tell users of the iconset, that the set has loaded.\n       * This finds all elements matching the selector argument and calls \n       * the method argument on them.\n       * @method updateIcons\n       * @param selector {string} css selector to identify iconset users, \n       * defaults to '[icon]'\n       * @param method {string} method to call on found elements, \n       * defaults to 'updateIcon'\n       */\n      updateIcons: function(selector, method) {\n        selector = selector || '[icon]';\n        method = method || 'updateIcon';\n        var deep = window.ShadowDOMPolyfill ? '' : 'html /deep/ ';\n        var i$ = document.querySelectorAll(deep + selector);\n        for (var i=0, e; e=i$[i]; i++) {\n          if (e[method]) {\n            e[method].call(e);\n          }\n        }\n      }\n      \n\n    });\n\n  </script>\n\n</polymer-element>\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset-svg/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<html>\n<head>\n\n  <title>core-iconset-svg</title>\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"svg-sample-icons.html\">\n  <style shim-shadowdom>\n    .embiggen core-icon {\n      height: 128px;\n      width: 128px;\n    }\n\n    core-icon:nth-of-type(1) {\n      fill: orange;\n    }\n\n    core-icon:nth-of-type(2) {\n      fill: green;\n      stroke: orange;\n    }\n\n    core-icon:nth-of-type(3) {\n      fill: navy;\n    }\n\n    core-icon {\n      transition: all 0.5s;\n      -webkit-transition: all 0.5s;\n    }\n\n    core-icon:hover {\n      -webkit-filter: drop-shadow( 2px 2px 2px #333 );\n      filter: drop-shadow( 2px 2px 2px #333 );\n    }\n  </style>\n</head>\n<body unresolved>\n\n  <template is=\"auto-binding\">\n    <div class=\"embiggen\">\n      <template repeat=\"{{icon in icons}}\">\n        <core-icon icon=\"{{icon}}\"></core-icon>\n      </template>\n    </div>\n    <core-meta id=\"meta\" type=\"iconset\"></core-meta>\n  </template>\n  <script>\n    addEventListener('template-bound', function(e) {\n      var template = e.target;\n      var setName = 'svg-sample-icons';\n      var icons = template.$.meta.byId(setName).iconNames;\n      template.icons = icons.map(function(ic){ return setName + ':' +ic });\n    });\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset-svg/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-iconset-svg/svg-sample-icons.html",
    "content": "\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"core-iconset-svg.html\">\n\n<core-iconset-svg id=\"svg-sample-icons\" iconSize=\"100\">\n  <svg>\n    <defs> \n    <g id=\"codepen\"> \n      <path class=\"outer-ring\"  d=\"M50,0C22.385,0,0,22.385,0,50c0,27.615,22.385,50,50,50c27.614,0,50-22.385,50-50C100,22.385,77.615,0,50,0z M50,91.789\n      C26.958,91.789,8.212,73.042,8.212,50C8.212,26.958,26.958,8.212,50,8.212c23.042,0,41.788,18.747,41.788,41.789\n      C91.788,73.042,73.042,91.789,50,91.789z\"></path>\n      <path class=\"inner-logo\"  d=\"M80.893,40.234c-0.006-0.039-0.016-0.076-0.022-0.115c-0.013-0.075-0.027-0.15-0.046-0.223\n      c-0.012-0.044-0.028-0.086-0.042-0.128c-0.021-0.065-0.042-0.13-0.068-0.193c-0.018-0.044-0.039-0.088-0.059-0.13\n      c-0.028-0.06-0.057-0.119-0.09-0.175c-0.024-0.042-0.051-0.083-0.076-0.124c-0.036-0.055-0.073-0.109-0.112-0.161\n      c-0.029-0.039-0.06-0.078-0.091-0.115c-0.042-0.049-0.086-0.098-0.132-0.143c-0.035-0.036-0.069-0.072-0.106-0.104\n      c-0.049-0.044-0.099-0.086-0.15-0.127c-0.04-0.031-0.079-0.062-0.12-0.091c-0.016-0.01-0.029-0.023-0.044-0.033L51.474,19.531\n      c-0.893-0.595-2.055-0.595-2.947,0L20.267,38.371c-0.015,0.01-0.028,0.023-0.044,0.033c-0.042,0.029-0.081,0.06-0.12,0.091\n      c-0.052,0.041-0.102,0.083-0.15,0.127c-0.037,0.032-0.071,0.068-0.106,0.104c-0.046,0.045-0.09,0.094-0.132,0.143\n      c-0.031,0.038-0.062,0.077-0.092,0.115c-0.039,0.052-0.076,0.106-0.111,0.161c-0.027,0.041-0.052,0.082-0.076,0.124\n      c-0.033,0.057-0.062,0.115-0.09,0.175c-0.021,0.042-0.042,0.086-0.06,0.13c-0.026,0.063-0.047,0.128-0.068,0.193\n      c-0.014,0.042-0.029,0.084-0.042,0.128c-0.02,0.073-0.032,0.148-0.046,0.223c-0.006,0.039-0.016,0.076-0.021,0.115\n      c-0.016,0.114-0.024,0.229-0.024,0.346V59.42c0,0.117,0.009,0.233,0.024,0.348c0.005,0.038,0.015,0.077,0.021,0.114\n      c0.014,0.075,0.027,0.149,0.046,0.223c0.012,0.043,0.028,0.086,0.042,0.128c0.021,0.065,0.042,0.13,0.068,0.195\n      c0.018,0.044,0.039,0.086,0.06,0.129c0.028,0.06,0.058,0.118,0.09,0.177c0.024,0.041,0.049,0.082,0.076,0.122\n      c0.035,0.056,0.072,0.109,0.111,0.161c0.029,0.041,0.061,0.078,0.092,0.115c0.042,0.049,0.086,0.098,0.132,0.144\n      c0.035,0.036,0.069,0.071,0.106,0.104c0.048,0.044,0.099,0.086,0.15,0.127c0.039,0.031,0.078,0.062,0.12,0.091\n      c0.016,0.01,0.029,0.023,0.044,0.032l28.259,18.84c0.446,0.297,0.96,0.447,1.474,0.447c0.513,0,1.027-0.149,1.473-0.447\n      l28.259-18.84c0.015-0.009,0.028-0.022,0.044-0.032c0.042-0.029,0.081-0.06,0.12-0.091c0.051-0.041,0.102-0.083,0.15-0.127\n      c0.037-0.033,0.071-0.068,0.106-0.104c0.046-0.046,0.09-0.095,0.132-0.144c0.031-0.037,0.062-0.075,0.091-0.115\n      c0.04-0.052,0.076-0.105,0.112-0.161c0.025-0.041,0.051-0.081,0.076-0.122c0.033-0.059,0.062-0.117,0.09-0.177\n      c0.02-0.042,0.041-0.085,0.059-0.129c0.026-0.065,0.047-0.13,0.068-0.195c0.014-0.042,0.03-0.085,0.042-0.128\n      c0.02-0.074,0.033-0.148,0.046-0.223c0.006-0.037,0.016-0.076,0.022-0.114c0.014-0.115,0.023-0.231,0.023-0.348V40.581\n      C80.916,40.464,80.907,40.348,80.893,40.234z M52.657,26.707l20.817,13.877l-9.298,6.221l-11.519-7.706V26.707z M47.343,26.707\n      v12.393l-11.518,7.706l-9.299-6.221L47.343,26.707z M24.398,45.554L31.046,50l-6.648,4.446V45.554z M47.343,73.294L26.525,59.417\n      l9.299-6.219l11.518,7.704V73.294z M50,56.286L40.603,50L50,43.715L59.397,50L50,56.286z M52.657,73.294V60.902l11.519-7.704\n      l9.298,6.219L52.657,73.294z M75.602,54.447L68.955,50l6.647-4.446V54.447z\"></path> \n    </g>\n    \n    <path id=\"twitter\" d=\"M100.001,17.942c-3.681,1.688-7.633,2.826-11.783,3.339\n    c4.236-2.624,7.49-6.779,9.021-11.73c-3.965,2.432-8.354,4.193-13.026,5.146C80.47,10.575,75.138,8,69.234,8\n    c-11.33,0-20.518,9.494-20.518,21.205c0,1.662,0.183,3.281,0.533,4.833c-17.052-0.884-32.168-9.326-42.288-22.155\n    c-1.767,3.133-2.778,6.773-2.778,10.659c0,7.357,3.622,13.849,9.127,17.65c-3.363-0.109-6.525-1.064-9.293-2.651\n    c-0.002,0.089-0.002,0.178-0.002,0.268c0,10.272,7.072,18.845,16.458,20.793c-1.721,0.484-3.534,0.744-5.405,0.744\n    c-1.322,0-2.606-0.134-3.859-0.379c2.609,8.424,10.187,14.555,19.166,14.726c-7.021,5.688-15.867,9.077-25.48,9.077\n    c-1.656,0-3.289-0.102-4.895-0.297C9.08,88.491,19.865,92,31.449,92c37.737,0,58.374-32.312,58.374-60.336\n    c0-0.92-0.02-1.834-0.059-2.743C93.771,25.929,97.251,22.195,100.001,17.942L100.001,17.942z\"></path>\n\n    <g id=\"youtube\">\n      <path class=\"youtube\"  d=\"M98.77,27.492c-1.225-5.064-5.576-8.799-10.811-9.354C75.561,16.818,63.01,15.993,50.514,16\n      c-12.495-0.007-25.045,0.816-37.446,2.139c-5.235,0.557-9.583,4.289-10.806,9.354C0.522,34.704,0.5,42.574,0.5,50.001\n      c0,7.426,0,15.296,1.741,22.509c1.224,5.061,5.572,8.799,10.807,9.352c12.399,1.32,24.949,2.145,37.446,2.14\n      c12.494,0.005,25.047-0.817,37.443-2.14c5.234-0.555,9.586-4.291,10.81-9.352c1.741-7.213,1.753-15.083,1.753-22.509\n      S100.51,34.704,98.77,27.492 M67.549,52.203L43.977,64.391c-2.344,1.213-4.262,0.119-4.262-2.428V38.036\n      c0-2.548,1.917-3.644,4.262-2.429l23.572,12.188C69.896,49.008,69.896,50.992,67.549,52.203\"></path>\n    </g> \n    \n    </defs>\n  </svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "build/mui/bower_components/core-meta/README.md",
    "content": "core-meta\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-meta) for more information.\n"
  },
  {
    "path": "build/mui/bower_components/core-meta/bower.json",
    "content": "{\n  \"name\": \"core-meta\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "build/mui/bower_components/core-meta/core-meta.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<!--\n`core-meta` provides a method of constructing a self-organizing database.\nIt is useful to collate element meta-data for things like catalogs and for \ndesigner.\n\nExample, an element folder has a `metadata.html` file in it, that contains a \n`core-meta`, something like this:\n\n    <core-meta id=\"my-element\" label=\"My Element\">\n      <property name=\"color\" value=\"blue\"></property>\n    </core-meta>\n\nAn application can import as many of these files as it wants, and then use \n`core-meta` again to access the collected data.\n\n    <script>\n      var meta = document.createElement('core-meta');\n      console.log(meta.list); // dump a list of all meta-data elements that have been created\n    </script>\n\nUse `byId(id)` to retrive a specific core-meta.\n\n    <script>\n      var meta = document.createElement('core-meta');\n      console.log(meta.byId('my-element'));\n    </script>\n\nBy default all meta-data are stored in a single databse.  If your meta-data \nhave different types and want them to be stored separately, use `type` to \ndifferentiate them.\n\nExample:\n\n    <core-meta id=\"x-foo\" type=\"xElt\"></core-meta>\n    <core-meta id=\"x-bar\" type=\"xElt\"></core-meta>\n    <core-meta id=\"y-bar\" type=\"yElt\"></core-meta>\n\n    <script>\n      var meta = document.createElement('core-meta');\n      meta.type = 'xElt';\n      console.log(meta.list);\n    </script>\n\n@group Polymer Core Elements\n@element core-meta\n@homepage github.io\n-->\n\n<link rel=\"import\" href=\"../polymer/polymer.html\">\n\n<polymer-element name=\"core-meta\" attributes=\"label type\" hidden>\n<script>\n\n  (function() {\n    \n    var SKIP_ID = 'meta';\n    var metaData = {}, metaArray = {};\n\n    Polymer('core-meta', {\n      \n      /**\n       * The type of meta-data.  All meta-data with the same type with be\n       * stored together.\n       * \n       * @attribute type\n       * @type string\n       * @default 'default'\n       */\n      type: 'default',\n      \n      alwaysPrepare: true,\n      \n      ready: function() {\n        this.register(this.id);\n      },\n      \n      get metaArray() {\n        var t = this.type;\n        if (!metaArray[t]) {\n          metaArray[t] = [];\n        }\n        return metaArray[t];\n      },\n      \n      get metaData() {\n        var t = this.type;\n        if (!metaData[t]) {\n          metaData[t] = {};\n        }\n        return metaData[t];\n      },\n      \n      register: function(id, old) {\n        if (id && id !== SKIP_ID) {\n          this.unregister(this, old);\n          this.metaData[id] = this;\n          this.metaArray.push(this);\n        }\n      },\n      \n      unregister: function(meta, id) {\n        delete this.metaData[id || meta.id];\n        var i = this.metaArray.indexOf(meta);\n        if (i >= 0) {\n          this.metaArray.splice(i, 1);\n        }\n      },\n      \n      /**\n       * Returns a list of all meta-data elements with the same type.\n       * \n       * @property list\n       * @type array\n       * @default []\n       */\n      get list() {\n        return this.metaArray;\n      },\n      \n      /**\n       * Retrieves meta-data by ID.\n       *\n       * @method byId\n       * @param {String} id The ID of the meta-data to be returned.\n       * @returns Returns meta-data.\n       */\n      byId: function(id) {\n        return this.metaData[id];\n      }\n      \n    });\n    \n  })();\n  \n</script>\n</polymer-element>\n"
  },
  {
    "path": "build/mui/bower_components/core-meta/demo.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<html>\n<head>\n  <title>core-meta</title>\n  \n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"core-meta.html\">\n</head>\n\n<body>\n\n  <core-meta id=\"x-foo\" label=\"foo\"></core-meta>\n  <core-meta id=\"x-bar\" label=\"bar\"></core-meta>\n  <core-meta id=\"x-zot\" label=\"zot\"></core-meta>\n  \n  <core-meta id=\"apple\" label=\"apple\" type=\"fruit\"></core-meta>\n  <core-meta id=\"orange\" label=\"orange\" type=\"fruit\"></core-meta>\n  <core-meta id=\"grape\" label=\"grape\" type=\"fruit\"></core-meta>\n  \n  <h2>meta-data</h2>\n  \n  <template id=\"default\" repeat=\"{{metadata}}\">\n    <div>{{label}}</div>\n  </template>\n  \n  <h2>meta-data (type: fruit)</h2>\n  \n  <template id=\"fruit\" repeat=\"{{metadata}}\">\n    <div>{{label}}</div>\n  </template>\n  \n  <script>\n  \n    document.addEventListener('polymer-ready', function() {\n      var meta = document.createElement('core-meta');\n      document.querySelector('template#default').model = {\n        metadata: meta.list\n      };\n      \n      var fruitMeta = document.createElement('core-meta');\n      fruitMeta.type = 'fruit';\n      document.querySelector('template#fruit').model = {\n        metadata: fruitMeta.list\n      };\n    });\n    \n  </script>\n  \n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/core-meta/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "build/mui/bower_components/polymer/README.md",
    "content": "# Polymer\n\n[![Polymer build status](http://www.polymer-project.org/build/polymer-dev/status.png \"Polymer build status\")](http://build.chromium.org/p/client.polymer/waterfall)\n\n## Brief Overview\n\nFor more detailed info goto [http://polymer-project.org/](http://polymer-project.org/).\n\nPolymer is a new type of library for the web, designed to leverage the existing browser infrastructure to provide the encapsulation and extendability currently only available in JS libraries.\n\nPolymer is based on a set of future technologies, including [Shadow DOM](http://w3c.github.io/webcomponents/spec/shadow/), [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/) and Model Driven Views. Currently these technologies are implemented as polyfills or shims, but as browsers adopt these features natively, the platform code that drives Polymer evacipates, leaving only the value-adds.\n\n## Tools & Testing\n\nFor running tests or building minified files, consult the [tooling information](https://www.polymer-project.org/resources/tooling-strategy.html).\n\n## Releases\n\n[Release (tagged) versions](https://github.com/Polymer/polymer/releases) of Polymer include concatenated and minified sources for your convenience.\n\n[![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/polymer/README)](https://github.com/igrigorik/ga-beacon)\n"
  },
  {
    "path": "build/mui/bower_components/polymer/bower.json",
    "content": "{\n  \"name\": \"polymer\",\n  \"description\": \"Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.\",\n  \"homepage\": \"http://www.polymer-project.org/\",\n  \"keywords\": [\n    \"util\",\n    \"client\",\n    \"browser\",\n    \"web components\",\n    \"web-components\"\n  ],\n  \"author\": \"Polymer Authors <polymer-dev@googlegroups.com>\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-component-page\": \"Polymer/core-component-page#^0.5.0\",\n    \"webcomponentsjs\": \"Polymer/webcomponentsjs#^0.5.0\"\n  },\n  \"devDependencies\": {\n    \"tools\": \"Polymer/tools#master\",\n    \"web-component-tester\": \"Polymer/web-component-tester#^1.4.2\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "build/mui/bower_components/polymer/build.log",
    "content": "BUILD LOG\n---------\nBuild Time: 2014-12-11T12:46:30\n\nNODEJS INFORMATION\n==================\nnodejs: v0.10.33\ngrunt: 0.4.5\ngrunt-audit: 1.0.0\ngrunt-contrib-concat: 0.5.0\ngrunt-contrib-copy: 0.7.0\ngrunt-contrib-uglify: 0.6.0\ngrunt-string-replace: 1.0.0\n\nREPO REVISIONS\n==============\npolymer-expressions: 197c3a0150e7a13374cfcc72e7066113723a623d\npolymer-gestures: 17a6304916521be39409af292e8adf899bae0ce7\npolymer: a74e9f36526361dccb6df91be439ff9c3e043f41\n\nBUILD HASHES\n============\ndist/polymer.js: b9ad4c86af79c748cf4ea722f6d56671079fadf7\ndist/polymer.min.js: 2f2021ba9682b0bb702ee7fb68fb6fbfd288eac2\ndist/layout.html: 348d358a91712ecc2f8811efa430fcd954b4590c"
  },
  {
    "path": "build/mui/bower_components/polymer/dist/polymer.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"layout.html\">\n\n<script src=\"polymer.js\"></script>\n"
  },
  {
    "path": "build/mui/bower_components/polymer/layout.html",
    "content": "<!--\r\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\nCode distributed by Google as part of the polymer project is also\r\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n-->\r\n<style shim-shadowdom>\r\n/*******************************\r\n          Flex Layout\r\n*******************************/\r\n\r\nhtml /deep/ [layout][horizontal], html /deep/ [layout][vertical] {\r\n  display: -ms-flexbox;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n}\r\n\r\nhtml /deep/ [layout][horizontal][inline], html /deep/ [layout][vertical][inline] {\r\n  display: -ms-inline-flexbox;\r\n  display: -webkit-inline-flex;\r\n  display: inline-flex;\r\n}\r\n\r\nhtml /deep/ [layout][horizontal] {\r\n  -ms-flex-direction: row;\r\n  -webkit-flex-direction: row;\r\n  flex-direction: row;\r\n}\r\n\r\nhtml /deep/ [layout][horizontal][reverse] {\r\n  -ms-flex-direction: row-reverse;\r\n  -webkit-flex-direction: row-reverse;\r\n  flex-direction: row-reverse;\r\n}\r\n\r\nhtml /deep/ [layout][vertical] {\r\n  -ms-flex-direction: column;\r\n  -webkit-flex-direction: column;\r\n  flex-direction: column;\r\n}\r\n\r\nhtml /deep/ [layout][vertical][reverse] {\r\n  -ms-flex-direction: column-reverse;\r\n  -webkit-flex-direction: column-reverse;\r\n  flex-direction: column-reverse;\r\n}\r\n\r\nhtml /deep/ [layout][wrap] {\r\n  -ms-flex-wrap: wrap;\r\n  -webkit-flex-wrap: wrap;\r\n  flex-wrap: wrap;\r\n}\r\n\r\nhtml /deep/ [layout][wrap-reverse] {\r\n  -ms-flex-wrap: wrap-reverse;\r\n  -webkit-flex-wrap: wrap-reverse;\r\n  flex-wrap: wrap-reverse;\r\n}\r\n\r\nhtml /deep/ [flex] {\r\n  -ms-flex: 1 1 0.000000001px;\r\n  -webkit-flex: 1;\r\n  flex: 1;\r\n  -webkit-flex-basis: 0.000000001px;\r\n  flex-basis: 0.000000001px;\r\n}\r\n\r\nhtml /deep/ [vertical][layout] > [flex][auto-vertical], html /deep/ [vertical][layout]::shadow [flex][auto-vertical] {\r\n  -ms-flex: 1 1 auto;\r\n  -webkit-flex-basis: auto;\r\n  flex-basis: auto;\r\n}\r\n\r\nhtml /deep/ [flex][auto] {\r\n  -ms-flex: 1 1 auto;\r\n  -webkit-flex-basis: auto;\r\n  flex-basis: auto;\r\n}\r\n\r\nhtml /deep/ [flex][none] {\r\n  -ms-flex: none;\r\n  -webkit-flex: none;\r\n  flex: none;\r\n}\r\n\r\nhtml /deep/ [flex][one] {\r\n  -ms-flex: 1;\r\n  -webkit-flex: 1;\r\n  flex: 1;\r\n}\r\n\r\nhtml /deep/ [flex][two] {\r\n  -ms-flex: 2;\r\n  -webkit-flex: 2;\r\n  flex: 2;\r\n}\r\n\r\nhtml /deep/ [flex][three] {\r\n  -ms-flex: 3;\r\n  -webkit-flex: 3;\r\n  flex: 3;\r\n}\r\n\r\nhtml /deep/ [flex][four] {\r\n  -ms-flex: 4;\r\n  -webkit-flex: 4;\r\n  flex: 4;\r\n}\r\n\r\nhtml /deep/ [flex][five] {\r\n  -ms-flex: 5;\r\n  -webkit-flex: 5;\r\n  flex: 5;\r\n}\r\n\r\nhtml /deep/ [flex][six] {\r\n  -ms-flex: 6;\r\n  -webkit-flex: 6;\r\n  flex: 6;\r\n}\r\n\r\nhtml /deep/ [flex][seven] {\r\n  -ms-flex: 7;\r\n  -webkit-flex: 7;\r\n  flex: 7;\r\n}\r\n\r\nhtml /deep/ [flex][eight] {\r\n  -ms-flex: 8;\r\n  -webkit-flex: 8;\r\n  flex: 8;\r\n}\r\n\r\nhtml /deep/ [flex][nine] {\r\n  -ms-flex: 9;\r\n  -webkit-flex: 9;\r\n  flex: 9;\r\n}\r\n\r\nhtml /deep/ [flex][ten] {\r\n  -ms-flex: 10;\r\n  -webkit-flex: 10;\r\n  flex: 10;\r\n}\r\n\r\nhtml /deep/ [flex][eleven] {\r\n  -ms-flex: 11;\r\n  -webkit-flex: 11;\r\n  flex: 11;\r\n}\r\n\r\nhtml /deep/ [flex][twelve] {\r\n  -ms-flex: 12;\r\n  -webkit-flex: 12;\r\n  flex: 12;\r\n}\r\n\r\n/* alignment in cross axis */\r\n\r\nhtml /deep/ [layout][start] {\r\n  -ms-flex-align: start;\r\n  -webkit-align-items: flex-start;\r\n  align-items: flex-start;\r\n}\r\n\r\nhtml /deep/ [layout][center], html /deep/ [layout][center-center] {\r\n  -ms-flex-align: center;\r\n  -webkit-align-items: center;\r\n  align-items: center;\r\n}\r\n\r\nhtml /deep/ [layout][end] {\r\n  -ms-flex-align: end;\r\n  -webkit-align-items: flex-end;\r\n  align-items: flex-end;\r\n}\r\n\r\n/* alignment in main axis */\r\n\r\nhtml /deep/ [layout][start-justified] {\r\n  -ms-flex-pack: start;\r\n  -webkit-justify-content: flex-start;\r\n  justify-content: flex-start;\r\n}\r\n\r\nhtml /deep/ [layout][center-justified], html /deep/ [layout][center-center] {\r\n  -ms-flex-pack: center;\r\n  -webkit-justify-content: center;\r\n  justify-content: center;\r\n}\r\n\r\nhtml /deep/ [layout][end-justified] {\r\n  -ms-flex-pack: end;\r\n  -webkit-justify-content: flex-end;\r\n  justify-content: flex-end;\r\n}\r\n\r\nhtml /deep/ [layout][around-justified] {\r\n  -ms-flex-pack: distribute;\r\n  -webkit-justify-content: space-around;\r\n  justify-content: space-around;\r\n}\r\n\r\nhtml /deep/ [layout][justified] {\r\n  -ms-flex-pack: justify;\r\n  -webkit-justify-content: space-between;\r\n  justify-content: space-between;\r\n}\r\n\r\n/* self alignment */\r\n\r\nhtml /deep/ [self-start] {\r\n  -ms-align-self: flex-start;\r\n  -webkit-align-self: flex-start;\r\n  align-self: flex-start;\r\n}\r\n\r\nhtml /deep/ [self-center] {\r\n  -ms-align-self: center;\r\n  -webkit-align-self: center;\r\n  align-self: center;\r\n}\r\n\r\nhtml /deep/ [self-end] {\r\n  -ms-align-self: flex-end;\r\n  -webkit-align-self: flex-end;\r\n  align-self: flex-end;\r\n}\r\n\r\nhtml /deep/ [self-stretch] {\r\n  -ms-align-self: stretch;\r\n  -webkit-align-self: stretch;\r\n  align-self: stretch;\r\n}\r\n\r\n/*******************************\r\n          Other Layout\r\n*******************************/\r\n\r\nhtml /deep/ [block] {\r\n  display: block;\r\n}\r\n\r\n/* ie support for hidden */\r\nhtml /deep/ [hidden] {\r\n  display: none !important;\r\n}\r\n\r\nhtml /deep/ [relative] {\r\n  position: relative;\r\n}\r\n\r\nhtml /deep/ [fit] {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n\r\nbody[fullbleed] {\r\n  margin: 0;\r\n  height: 100vh;\r\n}\r\n\r\n/*******************************\r\n            Other\r\n*******************************/\r\n\r\nhtml /deep/ [segment], html /deep/ segment {\r\n  display: block;\r\n  position: relative;\r\n  -webkit-box-sizing: border-box;\r\n  -ms-box-sizing: border-box;\r\n  box-sizing: border-box;\r\n  margin: 1em 0.5em;\r\n  padding: 1em;\r\n  background-color: white;\r\n  -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);\r\n  box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);\r\n  border-radius: 5px 5px 5px 5px;\r\n}\r\n\r\n</style>"
  },
  {
    "path": "build/mui/bower_components/polymer/polymer.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"layout.html\">\n\n<script src=\"polymer.js\"></script>\n"
  },
  {
    "path": "build/mui/bower_components/polymer/polymer.js",
    "content": "/**\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 */\n// @version 0.5.1\nwindow.PolymerGestures = {};\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    },\n    path: function(event) {\n      var p;\n      if (HAS_FULL_PATH && event.path && event.path.length) {\n        p = event.path;\n      } else {\n        p = [];\n        var n = this.findTarget(event);\n        while (n) {\n          p.push(n);\n          n = n.parentNode || n.host;\n        }\n      }\n      return p;\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n\n(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 * 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 * 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(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    IS_IOS: false,\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    addGestureDependency: function(node, currentGestures) {\n      var gesturesWanted = node._pgEvents;\n      if (gesturesWanted && currentGestures) {\n        var gk = Object.keys(gesturesWanted);\n        for (var i = 0, r, ri, g; i < gk.length; i++) {\n          // gesture\n          g = gk[i];\n          if (gesturesWanted[g] > 0) {\n            // lookup gesture recognizer\n            r = this.dependencyMap[g];\n            // recognizer index\n            ri = r ? r.index : -1;\n            currentGestures[ri] = true;\n          }\n        }\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n\n        // in IOS mode, there is only a listener on the document, so this is not re-entrant\n        if (this.IS_IOS) {\n          var ev = inEvent;\n          if (type === 'touchstart') {\n            var ct = inEvent.changedTouches[0];\n            // set up a fake event to give to the path builder\n            ev = {target: inEvent.target, clientX: ct.clientX, clientY: ct.clientY, path: inEvent.path};\n          }\n          // use event path if available, otherwise build a path from target finding\n          var nodes = inEvent.path || scope.targetFinding.path(ev);\n          for (var i = 0, n; i < nodes.length; i++) {\n            n = nodes[i];\n            this.addGestureDependency(n, currentGestures);\n          }\n        } else {\n          this.addGestureDependency(inEvent.currentTarget, currentGestures);\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        if (rg) {\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      }\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(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 CURRENT_BUTTONS = 0;\n\n  var FIREFOX_LINUX = /Linux.*Firefox\\//i;\n\n  var HAS_BUTTONS = (function() {\n    // firefox on linux returns spec-incorrect values for mouseup.buttons\n    // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent.buttons#See_also\n    // https://codereview.chromium.org/727593003/#msg16\n    if (FIREFOX_LINUX.test(navigator.userAgent)) {\n      return false;\n    }\n    try {\n      return new MouseEvent('test', {buttons: 1}).buttons === 1;\n    } catch (e) {\n      return false;\n    }\n  })();\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        var type = inEvent.type;\n        var bit = WHICH_TO_BUTTONS[inEvent.which] || 0;\n        if (type === 'mousedown') {\n          CURRENT_BUTTONS |= bit;\n        } else if (type === 'mouseup') {\n          CURRENT_BUTTONS &= ~bit;\n        }\n        e.buttons = CURRENT_BUTTONS;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\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 ((HAS_BUTTONS ? e.buttons : e.which) === 0) {\n            if (!HAS_BUTTONS) {\n              CURRENT_BUTTONS = e.buttons = 0;\n            }\n            dispatcher.cancel(e);\n            this.cleanupMouse(e.buttons);\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(e.buttons);\n      }\n    },\n    cleanupMouse: function(buttons) {\n      if (buttons === 0) {\n        pointermap.delete(this.POINTER_ID);\n      }\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\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 DEDUP_DIST = 25;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    IS_IOS: false,\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (this.IS_IOS ? initial : !initial) {\n        dispatcher.listen(target, this.events);\n      }\n    },\n    unregister: function(target) {\n      if (!this.IS_IOS) {\n        dispatcher.unlisten(target, this.events);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.firstTarget = inTouch.target;\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        }, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      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  // prevent \"ghost clicks\" that come from elements that were removed in a touch handler\n  var STOP_PROP_FN = Event.prototype.stopImmediatePropagation || Event.prototype.stopPropagation;\n  document.addEventListener('click', function(ev) {\n    var x = ev.clientX, y = ev.clientY;\n    // check if a click is within DEDUP_DIST px radius of the touchstart\n    var closeTo = function(touch) {\n      var dx = Math.abs(x - touch.x), dy = Math.abs(y - touch.y);\n      return (dx <= DEDUP_DIST && dy <= DEDUP_DIST);\n    };\n    // if click coordinates are close to touch coordinates, assume the click came from a touch\n    var wasTouched = scope.mouseEvents.lastTouches.some(closeTo);\n    // if the click came from touch, and the touchstart target is not in the path of the click event,\n    // then the touchstart target was probably removed, and the click should be \"busted\"\n    var path = scope.targetFinding.path(ev);\n    if (wasTouched) {\n      for (var i = 0; i < path.length; i++) {\n        if (path[i] === touchEvents.firstTarget) {\n          return;\n        }\n      }\n      ev.preventDefault();\n      STOP_PROP_FN.call(ev);\n    }\n  }, true);\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  // Work around iOS bugs https://bugs.webkit.org/show_bug.cgi?id=135628 and https://bugs.webkit.org/show_bug.cgi?id=136506\n  var ua = navigator.userAgent;\n  var IS_IOS = ua.match(/iPad|iPhone|iPod/) && 'ontouchstart' in window;\n\n  dispatcher.IS_IOS = IS_IOS;\n  scope.touchEvents.IS_IOS = IS_IOS;\n\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n\n/**\n * 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 * 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 * 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      var tap = true;\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        tap = (e.buttons ^ 1) && (downState.buttons & 1);\n      }\n      return tap && !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 * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module pointer-gestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module pointer-gestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'down',\n      'up',\n      'move',\n      'cancel'\n    ],\n    exposes: [\n      'pinchstart',\n      'pinch',\n      'pinchend',\n      'rotate'\n    ],\n    defaultActions: {\n      'pinch': 'none',\n      'rotate': 'none'\n    },\n    reference: {},\n    down: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.targetFinding.LCA(points.a.target, points.b.target)\n        };\n\n        this.firePinch('pinchstart', points.diameter, points);\n      }\n    },\n    up: function(inEvent) {\n      var p = pointermap.get(inEvent.pointerId);\n      var num = pointermap.pointers();\n      if (p) {\n        if (num === 2) {\n          // fire 'pinchend' before deleting pointer\n          var points = this.calcChord();\n          this.firePinch('pinchend', points.diameter, points);\n        }\n        pointermap.delete(inEvent.pointerId);\n      }\n    },\n    move: function(inEvent) {\n      if (pointermap.has(inEvent.pointerId)) {\n        pointermap.set(inEvent.pointerId, inEvent);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    cancel: function(inEvent) {\n        this.up(inEvent);\n    },\n    firePinch: function(type, diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var e = eventFactory.makeGestureEvent(type, {\n        bubbles: true,\n        cancelable: true,\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y,\n        _source: 'pinch'\n      });\n      this.reference.target.dispatchEvent(e);\n    },\n    fireRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var e = eventFactory.makeGestureEvent('rotate', {\n        bubbles: true,\n        cancelable: true,\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y,\n        _source: 'pinch'\n      });\n      this.reference.target.dispatchEvent(e);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.firePinch('pinch', diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.fireRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      // start with at least two pointers\n      var points = {a: pointers[0], b: pointers[1]};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    }\n  };\n  dispatcher.registerGesture('pinch', pinch);\n})(window.PolymerGestures);\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\nPolymer = {\n  version: '0.5.1'\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(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\tBuild only script.\n\n  Ensures scripts needed for basic x-platform compatibility\n  will be run when platform.js is not loaded.\n */\nif (!window.WebComponents) {\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.WebComponents) {\n\n  WebComponents = {\n  \tflush: function() {},\n    flags: {log: {}}\n  };\n\n  Platform = WebComponents;\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/*\n  Create polyfill scope and feature detect native support.\n*/\nwindow.HTMLImports = window.HTMLImports || {flags:{}};\n\n(function(scope) {\n\n/**\n  Basic setup and simple module executer. We collect modules and then execute\n  the code later, only if it's necessary for polyfilling.\n*/\nvar IMPORT_LINK_TYPE = 'import';\nvar useNative = Boolean(IMPORT_LINK_TYPE in document.createElement('link'));\n\n/**\n  Support `currentScript` on all browsers as `document._currentScript.`\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.\n*/\n// NOTE: ShadowDOMPolyfill intrusion.\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\nvar wrap = function(node) {\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n};\nvar rootDocument = wrap(document);\n\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(rootDocument, '_currentScript', currentScriptDescriptor);\n\n/**\n  Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`\n  method. This api is necessary because unlike the native implementation,\n  script elements do not force imports to resolve. Instead, users should wrap\n  code in either an `HTMLImportsLoaded` hander or after load time in an\n  `HTMLImports.whenReady(callback)` call.\n\n  NOTE: This module also supports these apis under the native implementation.\n  Therefore, if this file is loaded, the same code can be used under both\n  the polyfill and native implementation.\n */\n\nvar isIE = /Trident/.test(navigator.userAgent);\n\n// call a callback when all HTMLImports in the document at call time\n// (or at least document ready) 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 whenReady(callback, doc) {\n  doc = doc || rootDocument;\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\nfunction markTargetLoaded(event) {\n  event.target.__loaded = true;\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) && callback) {\n       callback();\n    }\n  }\n  function loadedImport(e) {\n    markTargetLoaded(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, {target: 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).\n// However, we cannot rely on this entirely without watching the entire document\n// for import links. For perf reasons, currently only head is watched.\n// Instead, we fallback to checking if the import property is available\n// and the document is not itself loading.\nfunction isImportLoaded(link) {\n  return useNative ? link.__loaded ||\n      (link.import && link.import.readyState !== 'loading') :\n      link.__importParsed;\n}\n\n// TODO(sorvell): Workaround for\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\n// this bug is addressed.\n// (1) Install a mutation observer to see when HTMLImports have loaded\n// (2) if this script is run during document load it will watch any existing\n// imports for loading.\n//\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\n// with imports that are added to document.head since the mutation observer\n// watches only head for perf reasons, (2) it requires this script\n// to run before any imports have completed loading.\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  // make sure to catch any imports that are in the process of loading\n  // when this script is run.\n  (function() {\n    if (document.readyState === 'loading') {\n      var imports = document.querySelectorAll('link[rel=import]');\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\n        handleImport(imp);\n      }\n    }\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.\nwhenReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  rootDocument.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n// exports\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.useNative = useNative;\nscope.rootDocument = rootDocument;\nscope.whenReady = whenReady;\nscope.isIE = isIE;\n\n})(HTMLImports);\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n\n/*\n\tBuild only script.\n\n  Ensures scripts needed for basic x-platform compatibility\n  will be run when platform.js is not loaded.\n */\n}\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0 && s !== '';\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[i]);\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    return function(fn) {\n      return Promise.resolve().then(fn);\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      objects: objects,\n      get rootObject() { return rootObj; },\n      set rootObject(value) {\n        rootObj = value;\n        rootObjProps = {};\n      },\n      open: function(obs, object) {\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        if (lastObservedSet === this)\n          lastObservedSet = null;\n      },\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.rootObject !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.rootObject = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  // Export the observe-js object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, export as a global object.\n\n  var expose = global;\n\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      expose = exports = module.exports;\n    }\n    expose = exports;\n  } \n\n  expose.Observer = Observer;\n  expose.Observer.runEOM_ = runEOM;\n  expose.Observer.observerSentinel_ = observerSentinel; // for testing.\n  expose.Observer.hasObjectObserve = hasObserve;\n  expose.ArrayObserver = ArrayObserver;\n  expose.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  expose.ArraySplice = ArraySplice;\n  expose.ObjectObserver = ObjectObserver;\n  expose.PathObserver = PathObserver;\n  expose.CompoundObserver = CompoundObserver;\n  expose.Path = Path;\n  expose.ObserverTransform = ObserverTransform;\n  \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(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    },\n\n    get origin() {\n      var host;\n      if (this._isInvalid || !this._scheme) {\n        return '';\n      }\n      // javascript: Gecko returns String(\"\"), WebKit/Blink String(\"null\")\n      // Gecko throws error for \"data://\"\n      // data: Gecko returns \"\", Blink returns \"data://\", WebKit returns \"null\"\n      // Gecko returns String(\"\") for file: mailto:\n      // WebKit/Blink returns String(\"SCHEME://\") for file: mailto:\n      switch (this._scheme) {\n        case 'data':\n        case 'file':\n        case 'javascript':\n        case 'mailto':\n          return 'null';\n      }\n      host = this.host;\n      if (!host) {\n        return '';\n      }\n      return this._scheme + '://' + host;\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n\n(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\nscope.endOfMicrotask = endOfMicrotask;\n// bc \nPlatform.endOfMicrotask = endOfMicrotask;\n\n})(Polymer);\n\n\n(function(scope) {\n\n/**\n * @class Polymer\n */\n\n// imports\nvar endOfMicrotask = scope.endOfMicrotask;\n\n// logging\nvar log = window.WebComponents ? WebComponents.flags.log : {};\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\n/**\n * Force any pending data changes to be observed before \n * the next task. Data changes are processed asynchronously but are guaranteed\n * to be processed, for example, before painting. This method should rarely be \n * needed. It does nothing when Object.observe is available; \n * when Object.observe is not available, Polymer automatically flushes data \n * changes approximately every 1/10 second. \n * Therefore, `flush` should only be used when a data mutation should be \n * observed sooner than this.\n * \n * @method flush\n */\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    endOfMicrotask(function() {\n      flushing = false;\n      log.data && console.group('flush');\n      Platform.performMicrotaskCheckpoint();\n      log.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    // watch document visiblity to toggle dirty-checking\n    var visibilityHandler = function() {\n      // only flush if the page is visibile\n      if (document.visibilityState === 'hidden') {\n        if (scope.flushPoll) {\n          clearInterval(scope.flushPoll);\n        }\n      } else {\n        scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n      }\n    };\n    if (typeof document.visibilityState === 'string') {\n      document.addEventListener('visibilitychange', visibilityHandler);\n    }\n    visibilityHandler();\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// bc\nPlatform.flush = flush;\n\n})(window.Polymer);\n\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || baseUrl(root);\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, baseUrl(template));\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 || baseUrl(style);\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 || baseUrl(node);\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 = '{{.*}}';\nvar URL_HASH = '#';\n\nfunction baseUrl(node) {\n  var u = new URL(node.ownerDocument.baseURI);\n  u.search = '';\n  u.hash = '';\n  return u;\n}\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 = baseUrl(document.documentElement);\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  // empty '#' is discarded but we need to preserve it.\n  var hash = (targetUrl.href.slice(-1) === URL_HASH) ? URL_HASH : targetUrl.hash;\n  return t.join('/') + targetUrl.search + hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Polymer);\n\n(function(scope) {\n  var endOfMicrotask = Polymer.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(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(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(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(function(scope) {\n\n  // dom polyfill, additions, and utility methods\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(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(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  // helper for deserializing properties of various types to strings\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(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(function(scope) {\n\n  /**\n   * @class polymer-base\n   */\n\n  var utils = {\n\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically. Returns a handle which may \n      * be passed to <a href=\"#cancelAsync\">cancelAsync</a> to cancel the \n      * asynchronous call.\n      *\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      Polymer.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\n    /**\n      * Cancels a pending callback that was scheduled via \n      * <a href=\"#async\">async</a>. \n      *\n      * @method cancelAsync\n      * @param {handle} handle Handle of the `async` to cancel.\n      */\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n\n    /**\n      * Fire an event.\n      *\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    /**\n      * Fire an event asynchronously.\n      *\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    /**\n      * Remove class from old, add class to anew, if they exist.\n      *\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      *\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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        // NOTE: dirty check right after calling method to ensure \n        // changes apply quickly; in a very complicated app using high \n        // frequency events, this can be a perf concern; in this case,\n        // imperative handlers can be used to avoid flushing.\n        Polymer.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  /**\n   * @class Polymer\n   */\n\n  /**\n   * Add a gesture aware event handler to the given `node`. Can be used \n   * in place of `element.addEventListener` and ensures gestures will function\n   * as expected on mobile platforms. Please note that Polymer's declarative\n   * event handlers include this functionality by default.\n   * \n   * @method addEventListener\n   * @param {Node} node node on which to listen\n   * @param {String} eventType name of the event\n   * @param {Function} handlerFn event handler function\n   * @param {Boolean} capture set to true to invoke event capturing\n   * @type Function\n   */\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.addEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n\n  /**\n   * Remove a gesture aware event handler on the given `node`. To remove an\n   * event listener, the exact same arguments are required that were passed\n   * to `Polymer.addEventListener`.\n   * \n   * @method removeEventListener\n   * @param {Node} node node on which to listen\n   * @param {String} eventType name of the event\n   * @param {Function} handlerFn event handler function\n   * @param {Boolean} capture set to true to invoke event capturing\n   * @type Function\n   */\n  scope.removeEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.removeEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n\n})(Polymer);\n\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    // copy attributes defined in the element declaration to the instance\r\n    // e.g. <polymer-element name=\"x-foo\" tabIndex=\"0\"> tabIndex is copied\r\n    // to the element instance here.\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      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    // convert to a string value based on the type of `inferredType`\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    // serializes `name` property value and updates the corresponding attribute\r\n    // note that reflection is opt-in.\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(function(scope) {\n\n  /**\n   * @class polymer-base\n   */\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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    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\n    // creates a CompoundObserver to observe property changes\n    // NOTE, this is only done there are any properties in the `observe` object\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\n    // start observing property changes\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n\n    // handler for property changes; routes changes to observing methods\n    // note: array valued properties are observed for array splices\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\n    // call method iff it exists.\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n\n    /**\n     * Force any pending property changes to synchronously deliver to\n     * handlers specified in the `observe` object.\n     * Note, normally changes are processed at microtask time.\n     *\n     * @method deliverChanges\n     */\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\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\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue)) {\n        return;\n      }\n      // invoke property change side effects\n      this._propertyChanged(name, value, oldValue);\n      // emit change record\n      if (!Observer.hasObjectObserve) {\n        return;\n      }\n      var notifier = this._objectNotifier;\n      if (!notifier) {\n        notifier = this._objectNotifier = Object.getNotifier(this);\n      }\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n      notifier.notify(updateRecord);\n    },\n\n    _propertyChanged: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n\n    // creates a property binding (called via bind) to a published property.\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      var computed = this.element.prototype.computed;\n      // Binding an \"out-only\" value to a computed property. Note that\n      // since this observer isn't opened, it doesn't need to be closed on\n      // cleanup.\n      if (computed && computed[property]) {\n        var privateComputedBoundValue = property + 'ComputedBoundObservable_';\n        this[privateComputedBoundValue] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n\n    // NOTE property `name` must be published. This makes it an accessor.\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      // Present for properties which are computed and published and have a\n      // bound value.\n      var privateComputedBoundValue = name + 'ComputedBoundObservable_';\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n      // observable callback\n      var self = this;\n      function updateValue(value, oldValue) {\n        self[privateName] = value;\n        var setObserveable = self[privateComputedBoundValue];\n        if (setObserveable && typeof setObserveable.setValue == 'function') {\n          setObserveable.setValue(value);\n        }\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      }\n      // resolve initial value\n      var value = observable.open(updateValue);\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue) {\n            observable.setValue(value);\n          }\n        }\n      }\n      updateValue(value, oldValue);\n      // register and return observable\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n          self[privateComputedBoundValue] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\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\n    // property bookkeeping\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n      this._observers.push(observer);\n    },\n\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n      // observer array items are arrays of observers.\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      this._observers = [];\n    },\n\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n\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\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\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(function(scope) {\n\n  /**\n   * @class polymer-base\n   */\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\n\n  // element api supporting mdv\n  var mdv = {\n\n    /**\n     * Creates dom cloned from the given template, instantiating bindings\n     * with this element as the template model and `PolymerExpressions` as the\n     * binding delegate.\n     *\n     * @method instanceTemplate\n     * @param {Template} template source template from which to create dom.\n     */\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\n    // Called by TemplateBinding/NodeBind to setup a binding to the given\n    // property. It's overridden here to support property bindings\n    // in addition to attribute bindings that are supported by default.\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\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n\n    // Called by TemplateBinding when all bindings on an element have been \n    // executed. This signals that all element inputs have been gathered\n    // and it's safe to ready the element, create shadow-root and start\n    // data-observation.\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n\n    // called at detached time to signal that an element's bindings should be\n    // cleaned up. This is done asynchronously so that users have the chance\n    // to call `cancelUnbindAll` to prevent unbinding.\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    \n    /**\n     * This method should rarely be used and only if \n     * <a href=\"#cancelUnbindAll\">`cancelUnbindAll`</a> has been called to \n     * prevent element unbinding. In this case, the element's bindings will \n     * not be automatically cleaned up and it cannot be garbage collected \n     * by the system. If memory pressure is a concern or a \n     * large amount of elements need to be managed in this way, `unbindAll`\n     * can be called to deactivate the element's bindings and allow its \n     * memory to be reclaimed.\n     *\n     * @method unbindAll\n     */\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n\n    /**\n     * Call in `detached` to prevent the element from unbinding when it is \n     * detached from the dom. The element is unbound as a cleanup step that \n     * allows its memory to be reclaimed. \n     * If `cancelUnbindAll` is used, consider calling \n     * <a href=\"#unbindAll\">`unbindAll`</a> when the element is no longer\n     * needed. This will allow its memory to be reclaimed.\n     * \n     * @method cancelUnbindAll\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\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(function(scope) {\n\n  /**\n   * Common prototype for all Polymer Elements.\n   * \n   * @class polymer-base\n   * @homepage polymer.github.io\n   */\n  var base = {\n    /**\n     * Tags this object as the canonical Base prototype.\n     *\n     * @property PolymerBase\n     * @type boolean\n     * @default true\n     */\n    PolymerBase: true,\n\n    /**\n     * Debounce signals. \n     * \n     * Call `job` to defer a named signal, and all subsequent matching signals, \n     * until a wait time has elapsed with no new signal.\n     * \n     *     debouncedClickAction: function(e) {\n     *       // processClick only when it's been 100ms since the last click\n     *       this.job('click', function() {\n     *        this.processClick;\n     *       }, 100);\n     *     }\n     *\n     * @method job\n     * @param String {String} job A string identifier for the job to debounce.\n     * @param Function {Function} callback A function that is called (with `this` context) when the wait time elapses.\n     * @param Number {Number} wait Time in milliseconds (ms) after the last signal that must elapse before invoking `callback`\n     * @type Handle\n     */\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        // TODO(sjmiles): suggest we deprecate this call signature\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n\n    /**\n     * Invoke a superclass method. \n     * \n     * Use `super()` to invoke the most recently overridden call to the \n     * currently executing function. \n     * \n     * To pass arguments through, use the literal `arguments` as the parameter \n     * to `super()`.\n     *\n     *     nextPageAction: function(e) {\n     *       // invoke the superclass version of `nextPageAction`\n     *       this.super(arguments); \n     *     }\n     *\n     * To pass custom arguments, arrange them in an array.\n     *\n     *     appendSerialNo: function(value, serial) {\n     *       // prefix the superclass serial number with our lot # before\n     *       // invoking the superlcass\n     *       return this.super([value, this.lotNo + serial])\n     *     }\n     *\n     * @method super\n     * @type Any\n     * @param {args) An array of arguments to use when calling the superclass method, or null.\n     */\n    super: Polymer.super,\n\n    /**\n     * Lifecycle method called when the element is instantiated.\n     * \n     * Override `created` to perform custom create-time tasks. No need to call \n     * super-class `created` unless you are extending another Polymer element.\n     * Created is called before the element creates `shadowRoot` or prepares\n     * data-observation.\n     * \n     * @method created\n     * @type void\n     */\n    created: function() {\n    },\n\n    /**\n     * Lifecycle method called when the element has populated it's `shadowRoot`,\n     * prepared data-observation, and made itself ready for API interaction.\n     * \n     * @method ready\n     * @type void\n     */\n    ready: function() {\n    },\n\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom create-time tasks, implement `created` \n     * instead, which is called immediately after `createdCallback`. \n     * \n     * @method createdCallback\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\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\n    // system entry point, do not override\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      this.parseDeclarations(this.__proto__);\n      // NOTE: Support use of the `unresolved` attribute to help polyfill\n      // custom elements' `:unresolved` feature.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom tasks in your element, implement `attributeChanged` \n     * instead, which is called immediately after `attributeChangedCallback`. \n     * \n     * @method attributeChangedCallback\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\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom create-time tasks, implement `attached` \n     * instead, which is called immediately after `attachedCallback`. \n     * \n     * @method attachedCallback\n     */\n     attachedCallback: function() {\n      // when the element is attached, prevent it from unbinding.\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n\n     /**\n     * Implement to access custom elements in dom descendants, ancestors, \n     * or siblings. Because custom elements upgrade in document order, \n     * elements accessed in `ready` or `attached` may not be upgraded. When\n     * `domReady` is called, all registered custom elements are guaranteed\n     * to have been upgraded.\n     * \n     * @method domReady\n     */\n\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom create-time tasks, implement `detached` \n     * instead, which is called immediately after `detachedCallback`. \n     * \n     * @method detachedCallback\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\n    /**\n     * Walks the prototype-chain of this element and allows specific\n     * classes a chance to process static declarations.\n     * \n     * In particular, each polymer-element has it's own `template`.\n     * `parseDeclarations` is used to accumulate all element `template`s\n     * from an inheritance chain.\n     *\n     * `parseDeclaration` static methods implemented in the chain are called\n     * recursively, oldest first, with the `<polymer-element>` associated\n     * with the current prototype passed as an argument.\n     * \n     * An element may override this method to customize shadow-root generation. \n     * \n     * @method parseDeclarations\n     */\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n\n    /**\n     * Perform init-time actions based on static information in the\n     * `<polymer-element>` instance argument.\n     *\n     * For example, the standard implementation locates the template associated\n     * with the given `<polymer-element>` and stamps it into a shadow-root to\n     * implement shadow inheritance.\n     *  \n     * An element may override this method for custom behavior. \n     * \n     * @method parseDeclaration\n     */\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\n    /**\n     * Given a `<polymer-element>`, find an associated template (if any) to be\n     * used for shadow-root generation.\n     *\n     * An element may override this method for custom behavior. \n     * \n     * @method fetchTemplate\n     */\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n\n    /**\n     * Create a shadow-root in this host and stamp `template` as it's \n     * content. \n     *\n     * An element may override this method for custom behavior. \n     * \n     * @method shadowFromTemplate\n     */\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\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\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\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\n    /**\n     * Register a one-time callback when a child-list or sub-tree mutation\n     * occurs on node. \n     *\n     * For persistent callbacks, call onMutation from your listener. \n     * \n     * @method onMutation\n     * @param Node {Node} node Node to watch for mutations.\n     * @param Function {Function} listener Function to call on mutation. The function is invoked as `listener.call(this, observer, mutations);` where `observer` is the MutationObserver that triggered the notification, and `mutations` is the native mutation list.\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  /**\n   * @class Polymer\n   */\n  \n  /**\n   * Returns true if the object includes <a href=\"#polymer-base\">polymer-base</a> in it's prototype chain.\n   * \n   * @method isBase\n   * @param Object {Object} object Object to test.\n   * @type Boolean\n   */\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  /**\n   * The Polymer base-class constructor.\n   * \n   * @property Base\n   * @type Function\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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 = WebComponents.ShadowCSS.makeScopeSelector(name, is);\n    return WebComponents.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype(name)) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  function instanceOfType(element, type) {\n    if (typeof type !== 'string') {\n      return false;\n    }\n    var proto = HTMLElement.getPrototypeForTag(type);\n    var ctor = proto && proto.constructor;\n    if (!ctor) {\n      return false;\n    }\n    if (CustomElements.instanceof) {\n      return CustomElements.instanceof(element, ctor);\n    }\n    return element instanceof ctor;\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n  scope.instanceOfType = instanceOfType;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. WebComponents collects those calls until we can process them, which\n  // we do here.\n\n  if (WebComponents.consumeDeclarations) {\n    WebComponents.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(function(scope) {\n\n/**\n * @class polymer-base\n */\n\n /**\n  * Resolve a url path to be relative to a `base` url. If unspecified, `base`\n  * defaults to the element's ownerDocument url. Can be used to resolve\n  * paths from element's in templates loaded in HTMLImports to be relative\n  * to the document containing the element. Polymer automatically does this for\n  * url attributes in element templates; however, if a url, for\n  * example, contains a binding, then `resolvePath` can be used to ensure it is \n  * relative to the element document. For example, in an element's template,\n  *\n  *     <a href=\"{{resolvePath(path)}}\">Resolved</a>\n  * \n  * @method resolvePath\n  * @param {String} url Url path to resolve.\n  * @param {String} base Optional base url against which to resolve, defaults\n  * to the element's ownerDocument url.\n  * returns {String} resolved url.\n  */\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\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  // polymer-element declarative api: events feature\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(function(scope) {\n\n  // element api\n\n  var observationBlacklist = ['attribute'];\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          property = n.slice(0, -7);\n          if (this.canObserveProperty(property)) {\n            if (!observe) {\n              observe  = (prototype.observe = {});\n            }\n            observe[property] = observe[property] || n;\n          }\n        }\n      }\n    },\n    canObserveProperty: function(property) {\n      return (observationBlacklist.indexOf(property) < 0);\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        // warn and remove accessor names that are broken on some browsers\n        this.filterInvalidAccessorNames(publish);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n      var computed = prototype.computed;\n      if (computed) {\n        // warn and remove accessor names that are broken on some browsers\n        this.filterInvalidAccessorNames(computed);\n      }\n    },\n    // Publishing/computing a property where the name might conflict with a\n    // browser property is not currently supported to help users of Polymer\n    // avoid browser bugs:\n    //\n    // https://code.google.com/p/chromium/issues/detail?id=43394\n    // https://bugs.webkit.org/show_bug.cgi?id=49739\n    //\n    // We can lift this restriction when those bugs are fixed.\n    filterInvalidAccessorNames: function(propertyNames) {\n      for (var name in propertyNames) {\n        // Check if the name is in our blacklist.\n        if (this.propertyNameBlacklist[name]) {\n          console.warn('Cannot define property \"' + name + '\" for element \"' +\n            this.name + '\" because it has the same name as an HTMLElement ' +\n            'property, and not all browsers support overriding that. ' +\n            'Consider giving it a different name.');\n          // Remove the invalid accessor from the list.\n          delete propertyNames[name];\n        }\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name, ignoreWrites) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          if (ignoreWrites) {\n            return this[privateName];\n          }\n\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n, true);\n        }\n      }\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          // If the property is computed and published, the accessor is created\n          // above.\n          if (!prototype.computed || !prototype.computed[n]) {\n            this.createPropertyAccessor(n);\n          }\n        }\n      }\n    },\n    // This list contains some property names that people commonly want to use,\n    // but won't work because of Chrome/Safari bugs. It isn't an exhaustive\n    // list. In particular it doesn't contain any property names found on\n    // subtypes of HTMLElement (e.g. name, value). Rather it attempts to catch\n    // some common cases.\n    propertyNameBlacklist: {\n      children: 1,\n      'class': 1,\n      id: 1,\n      hidden: 1,\n      style: 1,\n      title: 1,\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\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(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(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        WebComponents.ShadowCSS.shimStyling(this.templateContent(), name,\n          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(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      Polymer.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n  \n    /**\n    Returns a list of elements that have had polymer-elements created but \n    are not yet ready to register. The list is an array of element definitions.\n    */\n    waitingFor: function() {\n      var e$ = [];\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          e$.push(e);\n        }\n      }\n      return e$;\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    Polymer.endOfMicrotask(function() {\n      HTMLImports.whenReady(function() {\n        queue.addReadyCallback(callback);\n        queue.waitToReady = false;\n        queue.check();\n    });\n    });\n  }\n\n  /**\n    Forces polymer to register any pending elements. Can be used to abort\n    waiting for elements that are partially defined.\n    @param timeout {Integer} Optional timeout in milliseconds\n  */\n  function forceReady(timeout) {\n    if (timeout === undefined) {\n      queue.ready();\n      return;\n    }\n    var handle = setTimeout(function() {\n      queue.ready();\n    }, timeout);\n    Polymer.whenReady(function() {\n      clearTimeout(handle);\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.waitingFor = queue.waitingFor.bind(queue);\n  scope.forceReady = forceReady;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n\n(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(function(scope) {\n\n/**\n * @class Polymer\n */\n\nvar whenReady = scope.whenReady;\n\n/**\n * Loads the set of HTMLImports contained in `node`. Notifies when all\n * the imports have loaded by calling the `callback` function argument.\n * This method can be used to lazily load imports. For example, given a \n * template:\n *     \n *     <template>\n *       <link rel=\"import\" href=\"my-import1.html\">\n *       <link rel=\"import\" href=\"my-import2.html\">\n *     </template>\n *\n *     Polymer.importElements(template.content, function() {\n *       console.log('imports lazily loaded'); \n *     });\n * \n * @method importElements\n * @param {Node} node Node containing the HTMLImports to load.\n * @param {Function} callback Callback called when all imports have loaded.\n */\nfunction importElements(node, callback) {\n  if (node) {\n    document.head.appendChild(node);\n    whenReady(callback);\n  } else if (callback) {\n    callback();\n  }\n}\n\n/**\n * Loads an HTMLImport for each url specified in the `urls` array.\n * Notifies when all the imports have loaded by calling the `callback` \n * function argument. This method can be used to lazily load imports. \n * For example,\n *\n *     Polymer.import(['my-import1.html', 'my-import2.html'], function() {\n *       console.log('imports lazily loaded'); \n *     });\n * \n * @method import\n * @param {Array} urls Array of urls to load as HTMLImports.\n * @param {Function} callback Callback called when all imports have loaded.\n */\nfunction _import(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\nscope.import = _import;\nscope.importElements = importElements;\n\n})(Polymer);\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"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/CustomElements.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.CustomElements = window.CustomElements || {\n  flags: {}\n};\n\n(function(scope) {\n  var flags = scope.flags;\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n  scope.hasNative = Boolean(document.registerElement);\n  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n})(CustomElements);\n\nCustomElements.addModule(function(scope) {\n  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : \"none\";\n  function forSubtree(node, cb) {\n    findAllElements(node, function(e) {\n      if (cb(e)) {\n        return true;\n      }\n      forRoots(e, cb);\n    });\n    forRoots(node, cb);\n  }\n  function findAllElements(node, find, data) {\n    var e = node.firstElementChild;\n    if (!e) {\n      e = node.firstChild;\n      while (e && e.nodeType !== Node.ELEMENT_NODE) {\n        e = e.nextSibling;\n      }\n    }\n    while (e) {\n      if (find(e, data) !== true) {\n        findAllElements(e, find, data);\n      }\n      e = e.nextElementSibling;\n    }\n    return null;\n  }\n  function forRoots(node, cb) {\n    var root = node.shadowRoot;\n    while (root) {\n      forSubtree(root, cb);\n      root = root.olderShadowRoot;\n    }\n  }\n  var processingDocuments;\n  function forDocumentTree(doc, cb) {\n    processingDocuments = [];\n    _forDocumentTree(doc, cb);\n    processingDocuments = null;\n  }\n  function _forDocumentTree(doc, cb) {\n    doc = wrap(doc);\n    if (processingDocuments.indexOf(doc) >= 0) {\n      return;\n    }\n    processingDocuments.push(doc);\n    var imports = doc.querySelectorAll(\"link[rel=\" + IMPORT_LINK_TYPE + \"]\");\n    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {\n      if (n.import) {\n        _forDocumentTree(n.import, cb);\n      }\n    }\n    cb(doc);\n  }\n  scope.forDocumentTree = forDocumentTree;\n  scope.forSubtree = forSubtree;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  var forSubtree = scope.forSubtree;\n  var forDocumentTree = scope.forDocumentTree;\n  function addedNode(node) {\n    return added(node) || addedSubtree(node);\n  }\n  function added(node) {\n    if (scope.upgrade(node)) {\n      return true;\n    }\n    attached(node);\n  }\n  function addedSubtree(node) {\n    forSubtree(node, function(e) {\n      if (added(e)) {\n        return true;\n      }\n    });\n  }\n  function attachedNode(node) {\n    attached(node);\n    if (inDocument(node)) {\n      forSubtree(node, function(e) {\n        attached(e);\n      });\n    }\n  }\n  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;\n  scope.hasPolyfillMutations = hasPolyfillMutations;\n  var isPendingMutations = false;\n  var pendingMutations = [];\n  function deferMutation(fn) {\n    pendingMutations.push(fn);\n    if (!isPendingMutations) {\n      isPendingMutations = true;\n      setTimeout(takeMutations);\n    }\n  }\n  function takeMutations() {\n    isPendingMutations = false;\n    var $p = pendingMutations;\n    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {\n      p();\n    }\n    pendingMutations = [];\n  }\n  function attached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _attached(element);\n      });\n    } else {\n      _attached(element);\n    }\n  }\n  function _attached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (!element.__attached && inDocument(element)) {\n        element.__attached = true;\n        if (element.attachedCallback) {\n          element.attachedCallback();\n        }\n      }\n    }\n  }\n  function detachedNode(node) {\n    detached(node);\n    forSubtree(node, function(e) {\n      detached(e);\n    });\n  }\n  function detached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _detached(element);\n      });\n    } else {\n      _detached(element);\n    }\n  }\n  function _detached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (element.__attached && !inDocument(element)) {\n        element.__attached = false;\n        if (element.detachedCallback) {\n          element.detachedCallback();\n        }\n      }\n    }\n  }\n  function inDocument(element) {\n    var p = element;\n    var doc = wrap(document);\n    while (p) {\n      if (p == doc) {\n        return true;\n      }\n      p = p.parentNode || p.host;\n    }\n  }\n  function watchShadow(node) {\n    if (node.shadowRoot && !node.shadowRoot.__watched) {\n      flags.dom && console.log(\"watching shadow-root for: \", node.localName);\n      var root = node.shadowRoot;\n      while (root) {\n        observe(root);\n        root = root.olderShadowRoot;\n      }\n    }\n  }\n  function handler(mutations) {\n    if (flags.dom) {\n      var mx = mutations[0];\n      if (mx && mx.type === \"childList\" && mx.addedNodes) {\n        if (mx.addedNodes) {\n          var d = mx.addedNodes[0];\n          while (d && d !== document && !d.host) {\n            d = d.parentNode;\n          }\n          var u = d && (d.URL || d._URL || d.host && d.host.localName) || \"\";\n          u = u.split(\"/?\").shift().split(\"/\").pop();\n        }\n      }\n      console.group(\"mutations (%d) [%s]\", mutations.length, u || \"\");\n    }\n    mutations.forEach(function(mx) {\n      if (mx.type === \"childList\") {\n        forEach(mx.addedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          addedNode(n);\n        });\n        forEach(mx.removedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          detachedNode(n);\n        });\n      }\n    });\n    flags.dom && console.groupEnd();\n  }\n  function takeRecords(node) {\n    node = wrap(node);\n    if (!node) {\n      node = wrap(document);\n    }\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    var observer = node.__observer;\n    if (observer) {\n      handler(observer.takeRecords());\n      takeMutations();\n    }\n  }\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  function observe(inRoot) {\n    if (inRoot.__observer) {\n      return;\n    }\n    var observer = new MutationObserver(handler);\n    observer.observe(inRoot, {\n      childList: true,\n      subtree: true\n    });\n    inRoot.__observer = observer;\n  }\n  function upgradeDocument(doc) {\n    doc = wrap(doc);\n    flags.dom && console.group(\"upgradeDocument: \", doc.baseURI.split(\"/\").pop());\n    addedNode(doc);\n    observe(doc);\n    flags.dom && console.groupEnd();\n  }\n  function upgradeDocumentTree(doc) {\n    forDocumentTree(doc, upgradeDocument);\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  scope.watchShadow = watchShadow;\n  scope.upgradeDocumentTree = upgradeDocumentTree;\n  scope.upgradeSubtree = addedSubtree;\n  scope.upgradeAll = addedNode;\n  scope.attachedNode = attachedNode;\n  scope.takeRecords = takeRecords;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  function upgrade(node) {\n    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\n      var is = node.getAttribute(\"is\");\n      var definition = scope.getRegisteredDefinition(is || node.localName);\n      if (definition) {\n        if (is && definition.tag == node.localName) {\n          return upgradeWithDefinition(node, definition);\n        } else if (!is && !definition.extends) {\n          return upgradeWithDefinition(node, definition);\n        }\n      }\n    }\n  }\n  function upgradeWithDefinition(element, definition) {\n    flags.upgrade && console.group(\"upgrade:\", element.localName);\n    if (definition.is) {\n      element.setAttribute(\"is\", definition.is);\n    }\n    implementPrototype(element, definition);\n    element.__upgraded__ = true;\n    created(element);\n    scope.attachedNode(element);\n    scope.upgradeSubtree(element);\n    flags.upgrade && console.groupEnd();\n    return element;\n  }\n  function implementPrototype(element, definition) {\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n  function customMixin(inTarget, inSrc, inNative) {\n    var used = {};\n    var p = inSrc;\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, Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n  function created(element) {\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n  scope.upgrade = upgrade;\n  scope.upgradeWithDefinition = upgradeWithDefinition;\n  scope.implementPrototype = implementPrototype;\n});\n\nCustomElements.addModule(function(scope) {\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  var upgrade = scope.upgrade;\n  var upgradeWithDefinition = scope.upgradeWithDefinition;\n  var implementPrototype = scope.implementPrototype;\n  var useNative = scope.useNative;\n  function register(name, options) {\n    var definition = options || {};\n    if (!name) {\n      throw new Error(\"document.registerElement: first argument `name` must not be empty\");\n    }\n    if (name.indexOf(\"-\") < 0) {\n      throw new Error(\"document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '\" + String(name) + \"'.\");\n    }\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    if (getRegisteredDefinition(name)) {\n      throw new Error(\"DuplicateDefinitionError: a type with name '\" + String(name) + \"' is already registered\");\n    }\n    if (!definition.prototype) {\n      definition.prototype = Object.create(HTMLElement.prototype);\n    }\n    definition.__name = name.toLowerCase();\n    definition.lifecycle = definition.lifecycle || {};\n    definition.ancestry = ancestry(definition.extends);\n    resolveTagName(definition);\n    resolvePrototypeChain(definition);\n    overrideAttributeApi(definition.prototype);\n    registerDefinition(definition.__name, definition);\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    definition.prototype.constructor = definition.ctor;\n    if (scope.ready) {\n      upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n  function overrideAttributeApi(prototype) {\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  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 && newValue !== oldValue) {\n      this.attributeChangedCallback(name, oldValue, newValue);\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  var reservedTagList = [ \"annotation-xml\", \"color-profile\", \"font-face\", \"font-face-src\", \"font-face-uri\", \"font-face-format\", \"font-face-name\", \"missing-glyph\" ];\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([ extendee ]);\n    }\n    return [];\n  }\n  function resolveTagName(definition) {\n    var baseTag = definition.extends;\n    for (var i = 0, a; a = definition.ancestry[i]; i++) {\n      baseTag = a.is && a.tag;\n    }\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      definition.is = definition.__name;\n    }\n  }\n  function resolvePrototypeChain(definition) {\n    if (!Object.__proto__) {\n      var nativePrototype = HTMLElement.prototype;\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\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      definition.native = nativePrototype;\n    }\n  }\n  function instantiate(definition) {\n    return upgradeWithDefinition(domCreateElement(definition.tag), definition);\n  }\n  var registry = {};\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n  var HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n  function createElementNS(namespace, tag, typeExtension) {\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n  function createElement(tag, typeExtension) {\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n    var element;\n    if (typeExtension) {\n      element = createElement(tag);\n      element.setAttribute(\"is\", typeExtension);\n      return element;\n    }\n    element = domCreateElement(tag);\n    if (tag.indexOf(\"-\") >= 0) {\n      implementPrototype(element, HTMLElement);\n    }\n    return element;\n  }\n  function cloneNode(deep) {\n    var n = domCloneNode.call(this, deep);\n    upgrade(n);\n    return n;\n  }\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n  var domCloneNode = Node.prototype.cloneNode;\n  var isInstance;\n  if (!Object.__proto__ && !useNative) {\n    isInstance = function(obj, ctor) {\n      var p = obj;\n      while (p) {\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  document.registerElement = register;\n  document.createElement = createElement;\n  document.createElementNS = createElementNS;\n  Node.prototype.cloneNode = cloneNode;\n  scope.registry = registry;\n  scope.instanceof = isInstance;\n  scope.reservedTagList = reservedTagList;\n  scope.getRegisteredDefinition = getRegisteredDefinition;\n  document.register = document.registerElement;\n});\n\n(function(scope) {\n  var useNative = scope.useNative;\n  var initializeModules = scope.initializeModules;\n  var isIE11OrOlder = /Trident/.test(navigator.userAgent);\n  if (useNative) {\n    var nop = function() {};\n    scope.watchShadow = nop;\n    scope.upgrade = nop;\n    scope.upgradeAll = nop;\n    scope.upgradeDocumentTree = nop;\n    scope.upgradeSubtree = nop;\n    scope.takeRecords = nop;\n    scope.instanceof = function(obj, base) {\n      return obj instanceof base;\n    };\n  } else {\n    initializeModules();\n  }\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  if (!window.wrap) {\n    if (window.ShadowDOMPolyfill) {\n      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n    } else {\n      window.wrap = window.unwrap = function(node) {\n        return node;\n      };\n    }\n  }\n  function bootstrap() {\n    upgradeDocumentTree(wrap(document));\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        upgradeDocumentTree(wrap(elt.import));\n      };\n    }\n    CustomElements.ready = true;\n    setTimeout(function() {\n      CustomElements.readyTime = Date.now();\n      if (window.HTMLImports) {\n        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n      }\n      document.dispatchEvent(new CustomEvent(\"WebComponentsReady\", {\n        bubbles: true\n      }));\n    });\n  }\n  if (isIE11OrOlder && 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  if (document.readyState === \"complete\" || scope.flags.eager) {\n    bootstrap();\n  } else if (document.readyState === \"interactive\" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {\n    bootstrap();\n  } else {\n    var loadEvent = window.HTMLImports && !HTMLImports.ready ? \"HTMLImportsLoaded\" : \"DOMContentLoaded\";\n    window.addEventListener(loadEvent, bootstrap);\n  }\n})(window.CustomElements);"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/HTMLImports.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.HTMLImports = window.HTMLImports || {\n  flags: {}\n};\n\n(function(scope) {\n  var IMPORT_LINK_TYPE = \"import\";\n  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement(\"link\"));\n  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\n  var wrap = function(node) {\n    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n  };\n  var rootDocument = wrap(document);\n  var currentScriptDescriptor = {\n    get: function() {\n      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== \"complete\" ? document.scripts[document.scripts.length - 1] : null);\n      return wrap(script);\n    },\n    configurable: true\n  };\n  Object.defineProperty(document, \"_currentScript\", currentScriptDescriptor);\n  Object.defineProperty(rootDocument, \"_currentScript\", currentScriptDescriptor);\n  var isIE = /Trident|Edge/.test(navigator.userAgent);\n  function whenReady(callback, doc) {\n    doc = doc || rootDocument;\n    whenDocumentReady(function() {\n      watchImportsLoad(callback, doc);\n    }, doc);\n  }\n  var requiredReadyState = isIE ? \"complete\" : \"interactive\";\n  var READY_EVENT = \"readystatechange\";\n  function isDocumentReady(doc) {\n    return doc.readyState === \"complete\" || doc.readyState === requiredReadyState;\n  }\n  function whenDocumentReady(callback, doc) {\n    if (!isDocumentReady(doc)) {\n      var checkReady = function() {\n        if (doc.readyState === \"complete\" || 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  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n  function 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 && callback) {\n        callback();\n      }\n    }\n    function loadedImport(e) {\n      markTargetLoaded(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            target: imp\n          });\n        } else {\n          imp.addEventListener(\"load\", loadedImport);\n          imp.addEventListener(\"error\", loadedImport);\n        }\n      }\n    } else {\n      checkDone();\n    }\n  }\n  function isImportLoaded(link) {\n    return useNative ? link.__loaded || link.import && link.import.readyState !== \"loading\" : link.__importParsed;\n  }\n  if (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, {\n      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    function isImport(element) {\n      return element.localName === \"link\" && element.rel === \"import\";\n    }\n    function handleImport(element) {\n      var loaded = element.import;\n      if (loaded) {\n        markTargetLoaded({\n          target: element\n        });\n      } else {\n        element.addEventListener(\"load\", markTargetLoaded);\n        element.addEventListener(\"error\", markTargetLoaded);\n      }\n    }\n    (function() {\n      if (document.readyState === \"loading\") {\n        var imports = document.querySelectorAll(\"link[rel=import]\");\n        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {\n          handleImport(imp);\n        }\n      }\n    })();\n  }\n  whenReady(function() {\n    HTMLImports.ready = true;\n    HTMLImports.readyTime = new Date().getTime();\n    rootDocument.dispatchEvent(new CustomEvent(\"HTMLImportsLoaded\", {\n      bubbles: true\n    }));\n  });\n  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n  scope.useNative = useNative;\n  scope.rootDocument = rootDocument;\n  scope.whenReady = whenReady;\n  scope.isIE = isIE;\n})(HTMLImports);\n\n(function(scope) {\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n})(HTMLImports);\n\nHTMLImports.addModule(function(scope) {\n  var CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n  var CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n  var 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  scope.path = path;\n});\n\nHTMLImports.addModule(function(scope) {\n  xhr = {\n    async: true,\n    ok: function(request) {\n      return request.status >= 200 && request.status < 300 || request.status === 304 || 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          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = locationHeader.substr(0, 1) === \"/\" ? location.origin + locationHeader : locationHeader;\n          }\n          next.call(nextContext, !xhr.ok(request) && request, 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  scope.xhr = xhr;\n});\n\nHTMLImports.addModule(function(scope) {\n  var xhr = scope.xhr;\n  var flags = scope.flags;\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  Loader.prototype = {\n    addNodes: function(nodes) {\n      this.inflight += nodes.length;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        this.require(n);\n      }\n      this.checkDone();\n    },\n    addNode: function(node) {\n      this.inflight++;\n      this.require(node);\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      elt.__nodeUrl = url;\n      if (!this.dedupe(url, elt)) {\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        this.pending[url].push(elt);\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        this.tail();\n        return true;\n      }\n      this.pending[url] = [ elt ];\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log(\"fetch\", url, elt);\n      if (url.match(/^data:/)) {\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      }\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        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  scope.Loader = Loader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var Observer = function(addCallback) {\n    this.addCallback = addCallback;\n    this.mo = new MutationObserver(this.handler.bind(this));\n  };\n  Observer.prototype = {\n    handler: function(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          this.addedNodes(m.addedNodes);\n        }\n      }\n    },\n    addedNodes: function(nodes) {\n      if (this.addCallback) {\n        this.addCallback(nodes);\n      }\n      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {\n        if (n.children && n.children.length) {\n          this.addedNodes(n.children);\n        }\n      }\n    },\n    observe: function(root) {\n      this.mo.observe(root, {\n        childList: true,\n        subtree: true\n      });\n    }\n  };\n  scope.Observer = Observer;\n});\n\nHTMLImports.addModule(function(scope) {\n  var path = scope.path;\n  var rootDocument = scope.rootDocument;\n  var flags = scope.flags;\n  var isIE = scope.isIE;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = \"link[rel=\" + IMPORT_LINK_TYPE + \"]\";\n  var importParser = {\n    documentSelectors: IMPORT_SELECTOR,\n    importsSelectors: [ IMPORT_SELECTOR, \"link[rel=stylesheet]\", \"style\", \"script:not([type])\", 'script[type=\"text/javascript\"]' ].join(\",\"),\n    map: {\n      link: \"parseLink\",\n      script: \"parseScript\",\n      style: \"parseStyle\"\n    },\n    dynamicElements: [],\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    parseDynamic: function(elt, quiet) {\n      this.dynamicElements.push(elt);\n      if (!quiet) {\n        this.parseNext();\n      }\n    },\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      this.markDynamicParsingComplete(elt);\n      if (elt.__importElement) {\n        elt.__importElement.__importParsed = true;\n        this.markDynamicParsingComplete(elt.__importElement);\n      }\n      this.parsingElement = null;\n      flags.parse && console.log(\"completed\", elt);\n    },\n    markDynamicParsingComplete: function(elt) {\n      var i = this.dynamicElements.indexOf(elt);\n      if (i >= 0) {\n        this.dynamicElements.splice(i, 1);\n      }\n    },\n    parseImport: function(elt) {\n      if (HTMLImports.__importsParsingHook) {\n        HTMLImports.__importsParsingHook(elt);\n      }\n      if (elt.import) {\n        elt.import.__importParsed = true;\n      }\n      this.markParsingComplete(elt);\n      if (elt.__resource && !elt.__error) {\n        elt.dispatchEvent(new CustomEvent(\"load\", {\n          bubbles: false\n        }));\n      } else {\n        elt.dispatchEvent(new CustomEvent(\"error\", {\n          bubbles: false\n        }));\n      }\n      if (elt.__pending) {\n        var fn;\n        while (elt.__pending.length) {\n          fn = elt.__pending.shift();\n          if (fn) {\n            fn({\n              target: elt\n            });\n          }\n        }\n      }\n      this.parseNext();\n    },\n    parseLink: function(linkElt) {\n      if (nodeIsImport(linkElt)) {\n        this.parseImport(linkElt);\n      } else {\n        linkElt.href = linkElt.href;\n        this.parseGeneric(linkElt);\n      }\n    },\n    parseStyle: function(elt) {\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      port.parentNode.insertBefore(elt, port);\n    },\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      if (isIE && elt.localName === \"style\") {\n        var fakeLoad = false;\n        if (elt.textContent.indexOf(\"@import\") == -1) {\n          fakeLoad = true;\n        } else if (elt.sheet) {\n          fakeLoad = true;\n          var csr = elt.sheet.cssRules;\n          var len = csr ? csr.length : 0;\n          for (var i = 0, r; i < len && (r = csr[i]); i++) {\n            if (r.type === CSSRule.IMPORT_RULE) {\n              fakeLoad = fakeLoad && Boolean(r.styleSheet);\n            }\n          }\n        }\n        if (fakeLoad) {\n          elt.dispatchEvent(new CustomEvent(\"load\", {\n            bubbles: false\n          }));\n        }\n      }\n    },\n    parseScript: function(scriptElt) {\n      var script = document.createElement(\"script\");\n      script.__importElement = scriptElt;\n      script.src = scriptElt.src ? scriptElt.src : 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    nextToParse: function() {\n      this._mayParse = [];\n      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());\n    },\n    nextToParseInDoc: function(doc, link) {\n      if (doc && this._mayParse.indexOf(doc) < 0) {\n        this._mayParse.push(doc);\n        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {\n          if (!this.isParsed(n)) {\n            if (this.hasResource(n)) {\n              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n            } else {\n              return;\n            }\n          }\n        }\n      }\n      return link;\n    },\n    nextToParseDynamic: function() {\n      return this.dynamicElements[0];\n    },\n    parseSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;\n    },\n    isParsed: function(node) {\n      return node.__importParsed;\n    },\n    needsDynamicParsing: function(elt) {\n      return this.dynamicElements.indexOf(elt) >= 0;\n    },\n    hasResource: function(node) {\n      if (nodeIsImport(node) && node.import === undefined) {\n        return false;\n      }\n      return true;\n    }\n  };\n  function nodeIsImport(elt) {\n    return elt.localName === \"link\" && elt.rel === IMPORT_LINK_TYPE;\n  }\n  function generateScriptDataUrl(script) {\n    var scriptContent = generateScriptContent(script);\n    return \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(scriptContent);\n  }\n  function generateScriptContent(script) {\n    return script.textContent + generateSourceMapHint(script);\n  }\n  function generateSourceMapHint(script) {\n    var owner = script.ownerDocument;\n    owner.__importedScripts = owner.__importedScripts || 0;\n    var moniker = script.ownerDocument.baseURI;\n    var num = owner.__importedScripts ? \"-\" + owner.__importedScripts : \"\";\n    owner.__importedScripts++;\n    return \"\\n//# sourceURL=\" + moniker + num + \".js\\n\";\n  }\n  function cloneStyle(style) {\n    var clone = style.ownerDocument.createElement(\"style\");\n    clone.textContent = style.textContent;\n    path.resolveUrlsInStyle(clone);\n    return clone;\n  }\n  scope.parser = importParser;\n  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;\n});\n\nHTMLImports.addModule(function(scope) {\n  var flags = scope.flags;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;\n  var rootDocument = scope.rootDocument;\n  var Loader = scope.Loader;\n  var Observer = scope.Observer;\n  var parser = scope.parser;\n  var importer = {\n    documents: {},\n    documentPreloadSelectors: IMPORT_SELECTOR,\n    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(\",\"),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log(\"loaded\", url, elt);\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isImportLink(elt)) {\n        var doc = this.documents[url];\n        if (doc === undefined) {\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            this.bootDocument(doc);\n          }\n          this.documents[url] = doc;\n        }\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observer.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));\n  importer.observer = new Observer();\n  function isImportLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n  function isLinkRel(elt, rel) {\n    return elt.localName === \"link\" && elt.getAttribute(\"rel\") === rel;\n  }\n  function makeDocument(resource, url) {\n    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    doc._URL = url;\n    var base = doc.createElement(\"base\");\n    base.setAttribute(\"href\", url);\n    if (!doc.baseURI) {\n      Object.defineProperty(doc, \"baseURI\", {\n        value: url\n      });\n    }\n    var meta = doc.createElement(\"meta\");\n    meta.setAttribute(\"charset\", \"utf-8\");\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    doc.body.innerHTML = resource;\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\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    Object.defineProperty(document, \"baseURI\", baseURIDescriptor);\n    Object.defineProperty(rootDocument, \"baseURI\", baseURIDescriptor);\n  }\n  scope.importer = importer;\n  scope.importLoader = importLoader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var parser = scope.parser;\n  var importer = scope.importer;\n  var dynamic = {\n    added: function(nodes) {\n      var owner, parsed;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        if (!owner) {\n          owner = n.ownerDocument;\n          parsed = parser.isParsed(owner);\n        }\n        loading = this.shouldLoadNode(n);\n        if (loading) {\n          importer.loadNode(n);\n        }\n        if (this.shouldParseNode(n) && parsed) {\n          parser.parseDynamic(n, loading);\n        }\n      }\n    },\n    shouldLoadNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));\n    },\n    shouldParseNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));\n    }\n  };\n  importer.observer.addCallback = dynamic.added.bind(dynamic);\n  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;\n});\n\n(function(scope) {\n  var initializeModules = scope.initializeModules;\n  var isIE = scope.isIE;\n  if (scope.useNative) {\n    return;\n  }\n  if (isIE && 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  initializeModules();\n  var rootDocument = scope.rootDocument;\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(rootDocument);\n  }\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\" && !window.attachEvent) {\n    bootstrap();\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", bootstrap);\n  }\n})(HTMLImports);"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/README.md",
    "content": "webcomponents.js\n================\n\nA suite of polyfills supporting the [Web Components](http://webcomponents.org) specs:\n\n**Custom Elements**: allows authors to define their own custom tags ([spec](https://w3c.github.io/webcomponents/spec/custom/)).\n\n**HTML Imports**: a way to include and reuse HTML documents via other HTML documents ([spec](https://w3c.github.io/webcomponents/spec/imports/)).\n\n**Shadow DOM**: provides encapsulation by hiding DOM subtrees under shadow roots ([spec](https://w3c.github.io/webcomponents/spec/shadow/)).\n\nThis also folds in polyfills for `MutationObserver` and `WeakMap`.\n\n\n## Releases\n\nPre-built (concatenated & minified) versions of the polyfills are maintained in the [tagged versions](https://github.com/webcomponents/webcomponentsjs/releases) of this repo. There are two variants:\n\n`webcomponents.js` includes all of the polyfills.\n\n`webcomponents-lite.js` includes all polyfills except for shadow DOM.\n\n\n### Manually Building\n\nIf you wish to build the polyfills yourself, you'll need `node` and `gulp` on your system:\n\n * install [node.js](http://nodejs.org/) using the instructions on their website\n * use `npm` to install [gulp.js](http://gulpjs.com/): `npm install -g gulp`\n\nNow you are ready to build the polyfills with:\n\n    # install dependencies\n    npm install\n    # build\n    gulp build\n\nThe builds will be placed into the `dist/` directory.\n\n## Contribute\n\nSee the [contributing guide](CONTRIBUTING.md)\n\n\n"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/ShadowDOM.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  \"use strict\";\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n  function detectEval() {\n    if (typeof chrome !== \"undefined\" && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n    try {\n      var f = new Function(\"return true;\");\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n  var hasEval = detectEval();\n  function assert(b) {\n    if (!b) throw new Error(\"Assertion failed\");\n  }\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\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  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  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object) return propertyNames[i];\n    }\n  }\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n  getOwnPropertyNames(window);\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor) return wrapperConstructor;\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n    return GeneratedWrapper;\n  }\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name) : function() {\n      return this.__impl4cf1e782hg__[name];\n    };\n  }\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ? new Function(\"v\", \"this.__impl4cf1e782hg__.\" + name + \" = v\") : function(v) {\n      this.__impl4cf1e782hg__[name] = v;\n    };\n  }\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name + \".apply(this.__impl4cf1e782hg__, arguments)\") : function() {\n      return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);\n    };\n  }\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      return dummyDescriptor;\n    }\n  }\n  var isBrokenSafari = function() {\n    var descr = Object.getOwnPropertyDescriptor(Node.prototype, \"nodeType\");\n    return descr && !descr.get && !descr.set;\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_\") continue;\n      if (name in target) continue;\n      if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;\n      if (isFirefox) {\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      var isEvent = isEventHandlerName(name);\n      if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);\n      if (descriptor.writable || descriptor.set || isBrokenSafari) {\n        if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);\n      }\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\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  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);\n    defineNonEnumerableDataProperty(wrapperPrototype, \"constructor\", wrapperConstructor);\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;\n  }\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n    return GeneratedWrapper;\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    return GeneratedWrapper;\n  }\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n  function wrap(impl) {\n    if (impl === null) return null;\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ || (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n  function unwrap(wrapper) {\n    if (wrapper === null) return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n  function rewrap(node, wrapper) {\n    if (wrapper === null) return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\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  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})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n  function ArraySplice() {}\n  ArraySplice.prototype = {\n    calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n      for (var j = 0; j < columnCount; j++) distances[0][j] = j;\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])) distances[i][j] = distances[i - 1][j - 1]; 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      return distances;\n    },\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        var min;\n        if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;\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      edits.reverse();\n      return edits;\n    },\n    calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);\n      if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);\n        return [ splice ];\n      } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n      var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));\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          index++;\n          oldIndex++;\n          break;\n\n         case EDIT_UPDATE:\n          if (!splice) splice = newSplice(index, [], 0);\n          splice.addedCount++;\n          index++;\n          splice.removed.push(old[oldIndex]);\n          oldIndex++;\n          break;\n\n         case EDIT_ADD:\n          if (!splice) splice = newSplice(index, [], 0);\n          splice.addedCount++;\n          index++;\n          break;\n\n         case EDIT_DELETE:\n          if (!splice) splice = newSplice(index, [], 0);\n          splice.removed.push(old[oldIndex]);\n          oldIndex++;\n          break;\n        }\n      }\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;\n      return searchLength;\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])) count++;\n      return count;\n    },\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0, previous.length);\n    },\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n  scope.ArraySplice = ArraySplice;\n})(window.ShadowDOMPolyfill);\n\n(function(context) {\n  \"use strict\";\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\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  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {\n      characterData: true\n    });\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n  } else {\n    timerFunc = window.setTimeout;\n  }\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending) return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n  context.setEndOfMicrotask = setEndOfMicrotask;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var setEndOfMicrotask = scope.setEndOfMicrotask;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n  function scheduleCallback(observer) {\n    if (observer.scheduled_) return;\n    observer.scheduled_ = true;\n    globalMutationObservers.push(observer);\n    if (isScheduled) return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n  function notifyObservers() {\n    isScheduled = false;\n    while (globalMutationObservers.length) {\n      var notifyList = globalMutationObservers;\n      globalMutationObservers = [];\n      notifyList.sort(function(x, y) {\n        return x.uid_ - y.uid_;\n      });\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        mo.scheduled_ = false;\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n        }\n      }\n    }\n  }\n  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  function registerTransientObservers(ancestor, node) {\n    for (;ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations) continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree) registration.addTransientObserver(node);\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) return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer) registration.removeTransientObservers();\n      }\n    }\n  }\n  function enqueueMutation(target, type, data) {\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        if (node !== target && !options.subtree) continue;\n        if (type === \"attributes\" && !options.attributes) continue;\n        if (type === \"attributes\" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n        if (type === \"characterData\" && !options.characterData) continue;\n        if (type === \"childList\" && !options.childList) continue;\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n        if (type === \"attributes\" && options.attributeOldValue || type === \"characterData\" && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n      if (\"name\" in data && \"namespace\" in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n      if (data.addedNodes) record.addedNodes = data.addedNodes;\n      if (data.removedNodes) record.removedNodes = data.removedNodes;\n      if (data.previousSibling) record.previousSibling = data.previousSibling;\n      if (data.nextSibling) record.nextSibling = data.nextSibling;\n      if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];\n      scheduleCallback(observer);\n      observer.records_.push(record);\n    }\n  }\n  var slice = Array.prototype.slice;\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n    if (!(\"attributes\" in options) && (\"attributeOldValue\" in options || \"attributeFilter\" in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n    if (\"characterDataOldValue\" in options && !(\"characterData\" in options)) this.characterData = true; else this.characterData = !!options.characterData;\n    if (!this.attributes && (options.attributeOldValue || \"attributeFilter\" in options) || !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\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 || 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  var uidCounter = 0;\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n    this.scheduled_ = false;\n  }\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      var newOptions = new MutationObserverOptions(options);\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeTransientObservers();\n          registration.options = newOptions;\n        }\n      }\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\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            registrations.splice(i, 1);\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      scheduleCallback(this.observer);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\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            break;\n          }\n        }\n      }\n    }\n  };\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  function TreeScope(root, parent) {\n    this.root = root;\n    this.parent = parent;\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    contains: function(treeScope) {\n      for (;treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this) return true;\n      }\n      return false;\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  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n    if (node.treeScope_) return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  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  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot) path.push(olderShadowRoot);\n          }\n          path.push(insertionPoint);\n        }\n        current = destinationInsertionPoints[destinationInsertionPoints.length - 1];\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            break;\n          }\n          current = current.host;\n          path.push(current);\n        } else {\n          current = current.parentNode;\n          if (current) path.push(current);\n        }\n      }\n    }\n    return path;\n  }\n  function eventMustBeStopped(event) {\n    if (!event) return false;\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  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0) return currentTarget;\n    if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree) return node;\n    }\n    return path[path.length - 1];\n  }\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\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) result = a; else break;\n    }\n    return result;\n  }\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent) return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n    var lowestCommonAncestorTree;\n    var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n    if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;\n    for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree) return node;\n      }\n    }\n    return null;\n  }\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n  var pendingError;\n  function dispatchOriginalEvent(originalEvent) {\n    if (handledEventsTable.get(originalEvent)) 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  function isLoadLikeEvent(event) {\n    switch (event.type) {\n     case \"load\":\n     case \"beforeunload\":\n     case \"unload\":\n      return true;\n    }\n    return false;\n  }\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event)) throw new Error(\"InvalidStateError\");\n    currentlyDispatchingEvents.set(event, true);\n    scope.renderAllPending();\n    var eventPath;\n    var overrideTarget;\n    var win;\n    if (isLoadLikeEvent(event) && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n        if (!isLoadLikeEvent(event)) {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document) win = doc.defaultView;\n        }\n      }\n    }\n    eventPathTable.set(event, eventPath);\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n    return event.defaultPrevented;\n  }\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;\n    }\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;\n    }\n    return true;\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  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)) return;\n    }\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners) return true;\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE) return true;\n      if (phase === BUBBLING_PHASE) phase = AT_TARGET;\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n    if (\"relatedTarget\" in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n      if (unwrappedRelatedTarget) {\n        if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n          var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target) return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n    listeners.depth++;\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      if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n      try {\n        if (typeof listener.handler === \"function\") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);\n        if (stopImmediatePropagationTable.get(event)) return false;\n      } catch (ex) {\n        if (!pendingError) pendingError = ex;\n      }\n    }\n    listeners.depth--;\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) listeners.push(copy[i]);\n      }\n    }\n    return !stopPropagationTable.get(event);\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 && this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    keyLocation: true\n  };\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === \"beforeunload\" && !(this instanceof BeforeUnloadEvent)) {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, \"Event\", type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath) return [];\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  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget) return options;\n    return Object.create(options, {\n      relatedTarget: {\n        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) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype) mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent(\"temp\"));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n  var UIEvent = registerGenericEvent(\"UIEvent\", Event);\n  var CustomEvent = registerGenericEvent(\"CustomEvent\", Event);\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      if (relatedTarget !== undefined) return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\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  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction(\"initMouseEvent\", 14)\n  }, relatedTargetProto);\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction(\"initFocusEvent\", 5)\n  }, relatedTargetProto);\n  var MouseEvent = registerGenericEvent(\"MouseEvent\", UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent(\"FocusEvent\", UIEvent, focusEventProto);\n  var defaultInitDicts = Object.create(null);\n  var supportsEventConstructors = function() {\n    try {\n      new window.FocusEvent(\"focus\");\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  }();\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));\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 ? options[key] : defaultDict[key];\n      if (key === \"relatedTarget\") v = unwrap(v);\n      args.push(v);\n    });\n    event[\"init\" + name].apply(event, args);\n    return event;\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      defaultInitDicts[name] = initDict;\n    };\n    configureEventConstructor(\"Event\", {\n      bubbles: false,\n      cancelable: false\n    });\n    configureEventConstructor(\"CustomEvent\", {\n      detail: null\n    }, \"Event\");\n    configureEventConstructor(\"UIEvent\", {\n      view: null,\n      detail: 0\n    }, \"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\", {\n      relatedTarget: null\n    }, \"UIEvent\");\n  }\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\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  if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n  function isValidListener(fun) {\n    if (typeof fun === \"function\") return true;\n    return fun && fun.handleEvent;\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  var OriginalEventTarget = window.EventTarget;\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n  var methodNames = [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ];\n  [ Node, Window ].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + \"_\", {\n        value: p[name]\n      });\n    });\n  });\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type)) return;\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        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i])) return;\n        }\n      }\n      listeners.push(listener);\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) 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      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n      handledEventsTable.set(nativeEvent, false);\n      scope.renderAllPending();\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener) this.removeEventListener(eventType, tempListener, true);\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) return true;\n      }\n    }\n    return false;\n  }\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type)) return true;\n    }\n    return false;\n  }\n  if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n  var originalElementFromPoint = document.elementFromPoint;\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n    var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element) return null;\n    var path = getEventPath(element, null);\n    var idx = path.lastIndexOf(self);\n    if (idx == -1) return null; else path = path.slice(0, idx);\n    return eventRetargetting(path, self);\n  }\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;\n    };\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      var old = inlineEventHandlers[name];\n      if (old) this.removeEventListener(eventType, old.wrapped, false);\n      if (typeof value === \"function\") {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false) e.preventDefault(); else if (name === \"onbeforeunload\" && typeof rv === \"string\") e.returnValue = rv;\n        };\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\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})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent) return;\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent(\"TouchEvent\");\n  } catch (ex) {\n    return;\n  }\n  var nonEnumDescriptor = {\n    enumerable: false\n  };\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n  [ \"clientX\", \"clientY\", \"screenX\", \"screenY\", \"pageX\", \"pageY\", \"identifier\", \"webkitRadiusX\", \"webkitRadiusY\", \"webkitRotationAngle\", \"webkitForce\" ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, \"length\");\n  }\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\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  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n    initTouchEvent: function() {\n      throw new Error(\"Not implemented\");\n    }\n  });\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n  var nonEnumDescriptor = {\n    enumerable: false\n  };\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\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  function wrapNodeList(list) {\n    if (list == null) 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  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n  var surpressMutations = false;\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, \"childList\", {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, \"childList\", {\n      removedNodes: nodes\n    });\n  }\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\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      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      if (previousNode) previousNode.nextSibling_ = nodes[0];\n      if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];\n      return nodes;\n    }\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      oldParent.removeChild(node);\n    }\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode) previousNode.nextSibling_ = node;\n    if (nextNode) nextNode.previousSibling_ = node;\n    return nodes;\n  }\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\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  function snapshotNodeList(nodeList) {\n    return nodeList;\n  }\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\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  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);\n  }\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length) return;\n    var ownerDoc = owner.ownerDocument;\n    if (ownerDoc === nodes[0].ownerDocument) return;\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n    if (length === 1) return unwrap(nodes[0]);\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  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  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) originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ = 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  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\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  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild; child; child = child.nextSibling) {\n          cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    return clone;\n  }\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child)) return false;\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self) return true;\n    }\n    return false;\n  }\n  var OriginalNode = window.Node;\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n    EventTarget.call(this, original);\n    this.parentNode_ = undefined;\n    this.firstChild_ = undefined;\n    this.lastChild_ = undefined;\n    this.nextSibling_ = undefined;\n    this.previousSibling_ = undefined;\n    this.treeScope_ = undefined;\n  }\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n  var isIe = /Trident|Edge/.test(navigator.userAgent);\n  var removeChildOriginalHelper = isIe ? function(parent, child) {\n    try {\n      originalRemoveChild.call(parent, child);\n    } catch (ex) {\n      if (!(parent instanceof OriginalDocumentFragment)) throw ex;\n    }\n  } : function(parent, child) {\n    originalRemoveChild.call(parent, child);\n  };\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\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      refWrapper && assert(refWrapper.parentNode === this);\n      var nodes;\n      var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;\n      var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);\n      if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode) this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;\n        }\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n        if (parentNode) {\n          originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n      enqueueMutation(this, \"childList\", {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n      nodesWereAdded(nodes, this);\n      return childWrapper;\n    },\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          throw new Error(\"NotFoundError\");\n        }\n      }\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n      if (this.invalidateShadowRenderer()) {\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n        var parentNode = childNode.parentNode;\n        if (parentNode) removeChildOriginalHelper(parentNode, childNode);\n        if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;\n        }\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n      if (!surpressMutations) {\n        enqueueMutation(this, \"childList\", {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n      registerTransientObservers(this, childWrapper);\n      return childWrapper;\n    },\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n      if (oldChildWrapper.parentNode !== this) {\n        throw new Error(\"NotFoundError\");\n      }\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n      var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);\n      }\n      enqueueMutation(this, \"childList\", {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n      return oldChildWrapper;\n    },\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n    get parentNode() {\n      return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n    get firstChild() {\n      return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n    get lastChild() {\n      return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\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    get textContent() {\n      var s = \"\";\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      if (textContent == null) textContent = \"\";\n      var removedNodes = snapshotNodeList(this.childNodes);\n      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      var addedNodes = snapshotNodeList(this.childNodes);\n      enqueueMutation(this, \"childList\", {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\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    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n    compareDocumentPosition: function(otherNode) {\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));\n    },\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = \"\";\n      var modNode;\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) this.removeNode(n); else if (!modNode) modNode = 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.normalize();\n        }\n      }\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n  defineWrapGetter(Node, \"ownerDocument\");\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  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.originalInsertBefore = originalInsertBefore;\n  scope.originalRemoveChild = originalRemoveChild;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\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    return index;\n  }\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, \" \");\n  }\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector)) return el;\n      m = findOne(el, selector);\n      if (m) return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n  var XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n  function matchesEveryThing() {\n    return true;\n  }\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1)) result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\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      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      return findElements(this, index, result, p, selector, null);\n    }\n    return filterNodeList(list, index, result, deep);\n  }\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\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        return findOne(this, selector);\n      }\n      if (!wrappedItem) {\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          return findOne(this, selector);\n        }\n      }\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n      var result = new NodeList();\n      result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);\n      return result;\n    }\n  };\n  function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName, lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);\n    } else {\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n    return filterNodeList(list, index, result, false);\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      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      return findElements(this, index, result, p, ns, localName);\n    }\n    return filterNodeList(list, index, result, false);\n  }\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === \"*\" ? matchesEveryThing : matchesTagName;\n      result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());\n      return result;\n    },\n    getElementsByClassName: function(className) {\n      return this.querySelectorAll(\".\" + className);\n    },\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n      if (ns === \"*\") {\n        match = localName === \"*\" ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === \"*\" ? matchesNameSpace : matchesLocalNameNS;\n      }\n      result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);\n      return result;\n    }\n  };\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var NodeList = scope.wrappers.NodeList;\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n    remove: function() {\n      var p = this.parentNode;\n      if (p) p.removeChild(this);\n    }\n  };\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalCharacterData = window.CharacterData;\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  mixin(CharacterData.prototype, ChildNodeInterface);\n  registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(\"\"));\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n  var OriginalText = window.Text;\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) 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) this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n  registerWrapper(OriginalText, Text, document.createTextNode(\"\"));\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, \"class\");\n  }\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\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  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalElement = window.Element;\n  var matchesNames = [ \"matches\", \"mozMatchesSelector\", \"msMatchesSelector\", \"webkitMatchesSelector\" ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n  var matchesName = matchesNames[0];\n  var originalMatches = OriginalElement.prototype[matchesName];\n  function invalidateRendererBasedOnAttribute(element, name) {\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot) return;\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name)) renderer.invalidate();\n  }\n  function enqueAttributeChange(element, name, oldValue) {\n    enqueueMutation(element, \"attributes\", {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n  var classListTable = new WeakMap();\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      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n      return newShadowRoot;\n    },\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\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    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    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this, list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n    set className(v) {\n      this.setAttribute(\"class\", v);\n    },\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n    set id(v) {\n      this.setAttribute(\"id\", v);\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  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n  }\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n  registerWrapper(OriginalElement, Element, document.createElementNS(null, \"x\"));\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n  function escapeReplace(c) {\n    switch (c) {\n     case \"&\":\n      return \"&amp;\";\n\n     case \"<\":\n      return \"&lt;\";\n\n     case \">\":\n      return \"&gt;\";\n\n     case '\"':\n      return \"&quot;\";\n\n     case \" \":\n      return \"&nbsp;\";\n    }\n  }\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\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  var voidElements = makeSet([ \"area\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"wbr\" ]);\n  var plaintextParents = makeSet([ \"style\", \"script\", \"xmp\", \"iframe\", \"noembed\", \"noframes\", \"plaintext\", \"noscript\" ]);\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]) return s;\n      return s + getInnerHTML(node) + \"</\" + tagName + \">\";\n\n     case Node.TEXT_NODE:\n      var data = node.data;\n      if (parentNode && plaintextParents[parentNode.localName]) 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  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement) node = node.content;\n    var s = \"\";\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\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  var oldIe = /MSIE/.test(navigator.userAgent);\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n      var removedNodes = snapshotNodeList(this.childNodes);\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);\n      } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n      var addedNodes = snapshotNodeList(this.childNodes);\n      enqueueMutation(this, \"childList\", {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\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    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\n       case \"afterend\":\n        contextElement = this.parentNode;\n        refNode = this.nextSibling;\n        break;\n\n       case \"afterbegin\":\n        contextElement = this;\n        refNode = this.firstChild;\n        break;\n\n       case \"beforeend\":\n        contextElement = this;\n        refNode = null;\n        break;\n\n       default:\n        return;\n      }\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\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  function frag(contextElement, html) {\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  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n  [ \"clientHeight\", \"clientLeft\", \"clientTop\", \"clientWidth\", \"offsetHeight\", \"offsetLeft\", \"offsetTop\", \"offsetWidth\", \"scrollHeight\", \"scrollWidth\" ].forEach(getterRequiresRendering);\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  [ \"scrollLeft\", \"scrollTop\" ].forEach(getterAndSetterRequiresRendering);\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  [ \"getBoundingClientRect\", \"getClientRects\", \"scrollIntoView\" ].forEach(methodRequiresRendering);\n  registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement(\"b\"));\n  scope.wrappers.HTMLElement = HTMLElement;\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\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  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement(\"canvas\"));\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var OriginalHTMLContentElement = window.HTMLContentElement;\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    get select() {\n      return this.getAttribute(\"select\");\n    },\n    set select(value) {\n      this.setAttribute(\"select\", value);\n    },\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === \"select\") this.invalidateShadowRenderer(true);\n    }\n  });\n  if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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 OriginalHTMLFormElement = window.HTMLFormElement;\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      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement(\"form\"));\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement(\"img\"));\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n    }\n    var node = unwrap(document.createElement(\"img\"));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n    if (width !== undefined) node.width = width;\n    if (height !== undefined) node.height = height;\n  }\n  Image.prototype = HTMLImageElement.prototype;\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n  if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView) return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\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  function extractContent(templateElement) {\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  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    }\n  });\n  if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n  if (!OriginalHTMLMediaElement) return;\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement(\"audio\"));\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n  if (!OriginalHTMLAudioElement) return;\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement(\"audio\"));\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n    }\n    var node = unwrap(document.createElement(\"audio\"));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n    node.setAttribute(\"preload\", \"auto\");\n    if (src !== undefined) node.setAttribute(\"src\", src);\n  }\n  Audio.prototype = HTMLAudioElement.prototype;\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n  function trimText(s) {\n    return s.replace(/\\s+/g, \" \").trim();\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  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement(\"option\"));\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n    }\n    var node = unwrap(document.createElement(\"option\"));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n    if (text !== undefined) node.text = text;\n    if (value !== undefined) node.setAttribute(\"value\", value);\n    if (defaultSelected === true) node.setAttribute(\"selected\", \"\");\n    node.selected = selected === true;\n  }\n  Option.prototype = HTMLOptionElement.prototype;\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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 OriginalHTMLSelectElement = window.HTMLSelectElement;\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\") before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n    remove: function(indexOrNode) {\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n      if (typeof indexOrNode === \"object\") indexOrNode = unwrap(indexOrNode);\n      unwrap(this).remove(indexOrNode);\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement(\"select\"));\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLTableElement = window.HTMLTableElement;\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    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\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  registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement(\"table\"));\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\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  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement(\"thead\"));\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\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    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement(\"tr\"));\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n     case \"content\":\n      return new HTMLContentElement(node);\n\n     case \"shadow\":\n      return new HTMLShadowElement(node);\n\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\n(function(scope) {\n  \"use strict\";\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\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  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  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var OriginalSVGUseElement = window.SVGUseElement;\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  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\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  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance) return;\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n    get childNodes() {\n      throw new Error(\"Not implemented\");\n    },\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement(\"canvas\").getContext(\"2d\"));\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  if (!OriginalWebGLRenderingContext) return;\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ? {\n    drawingBufferHeight: null,\n    drawingBufferWidth: null\n  } : {};\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalRange = window.Range;\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  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n  registerWrapper(window.Range, Range, document.createRange());\n  scope.wrappers.Range = Range;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n  var Comment = registerObject(document.createComment(\"\"));\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n    rewrap(node, this);\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n    this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n    getElementById: function(id) {\n      if (spaceCharRe.test(id)) return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n  scope.wrappers.ShadowRoot = ShadowRoot;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var ArraySplice = scope.ArraySplice;\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\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    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n    scope.originalInsertBefore.call(parentNode, newChild, refChild);\n  }\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper);\n    var parentNode = node.parentNode;\n    if (!parentNode) return;\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n    if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n    if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;\n    scope.originalRemoveChild.call(parentNode, node);\n  }\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv) distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\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  var request = oneOf(window, [ \"requestAnimationFrame\", \"mozRequestAnimationFrame\", \"webkitRequestAnimationFrame\", \"setTimeout\" ]);\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n  function renderAllPending() {\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty) continue;\n      renderer.render();\n    }\n    pendingDirtyRenderers = [];\n  }\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\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  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot) return root;\n    return null;\n  }\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n    sync: function(opt_added) {\n      if (this.skip) return;\n      var nodeWrapper = this.node;\n      var newChildren = this.childNodes;\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\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        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper)) remove(wrapper);\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          added.set(newChildWrapper, true);\n          newChildRenderNode.sync(added);\n        }\n        lastIndex += addedCount;\n      }\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n  ShadowRenderer.prototype = {\n    render: function(opt_renderNode) {\n      if (!this.dirty) return;\n      this.invalidateAttributes();\n      var host = this.host;\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer) renderNode.sync();\n      this.dirty = false;\n    },\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer) parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer) return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n    distribution: function(root) {\n      this.resetAllSubtrees(root);\n      this.distributionResolution(root);\n    },\n    resetAll: function(node) {\n      if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);\n      this.resetAllSubtrees(node);\n    },\n    resetAllSubtrees: function(node) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n      if (node.shadowRoot) this.resetAll(node.shadowRoot);\n      if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);\n    },\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        var pool = poolPopulation(shadowHost);\n        var shadowTrees = getShadowTrees(shadowHost);\n        for (var i = 0; i < shadowTrees.length; i++) {\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n          var shadow = getShadowInsertionPoint(shadowTree);\n          if (shadow) {\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              pool = poolPopulation(olderShadowRoot);\n            }\n            for (var j = 0; j < pool.length; j++) {\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n          this.distributionResolution(shadowTree);\n        }\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n    poolDistribution: function(node, pool) {\n      if (node instanceof HTMLShadowElement) return;\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute(\"select\"));\n        var anyDistributed = false;\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node) continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n        if (!anyDistributed) {\n          for (var child = content.firstChild; child; child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n        return;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\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      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\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)) children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n    updateDependentAttributes: function(selector) {\n      if (!selector) return;\n      var attributes = this.attributes;\n      if (/\\.\\w+/.test(selector)) attributes[\"class\"] = true;\n      if (/#\\w+/.test(selector)) attributes[\"id\"] = true;\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n    },\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\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  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement) return node;\n    if (node instanceof HTMLContentElement) return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res) return res;\n    }\n    return null;\n  }\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);\n  }\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n  function resetDestinationInsertionPoints(node) {\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute(\"select\");\n    if (!select) return true;\n    select = select.trim();\n    if (!select) return true;\n    if (!(node instanceof Element)) return false;\n    if (!selectorStartCharRe.test(select)) return false;\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      return false;\n    }\n  }\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;\n  }\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n  function getShadowTrees(host) {\n    var trees = [];\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n  function render(host) {\n    new ShadowRenderer(host).render();\n  }\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n    return false;\n  };\n  HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n  HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    this.invalidateShadowRenderer();\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer) renderer.invalidate();\n  };\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove\n  };\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var elementsWithFormProperty = [ \"HTMLButtonElement\", \"HTMLFieldSetElement\", \"HTMLInputElement\", \"HTMLKeygenElement\", \"HTMLLabelElement\", \"HTMLLegendElement\", \"HTMLObjectElement\", \"HTMLOutputElement\", \"HTMLTextAreaElement\" ];\n  function createWrapperConstructor(name) {\n    if (!window[name]) return;\n    assert(!scope.wrappers[name]);\n    var GeneratedWrapper = function(node) {\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    registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalSelection = window.Selection;\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  registerWrapper(window.Selection, Selection, window.getSelection());\n  scope.wrappers.Selection = Selection;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var implementationTable = new WeakMap();\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  defineWrapGetter(Document, \"documentElement\");\n  defineWrapGetter(Document, \"body\");\n  defineWrapGetter(Document, \"head\");\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  [ \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"getElementById\" ].forEach(wrapMethod);\n  var originalAdoptNode = document.adoptNode;\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot) doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot) doc.adoptNode(oldShadowRoot);\n  }\n  var originalGetSelection = document.getSelection;\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode) 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, \"[name=\" + JSON.stringify(String(name)) + \"]\");\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      if (!prototype) prototype = Object.create(HTMLElement.prototype);\n      if (scope.nativePrototypeTable.get(prototype)) {\n        throw new Error(\"NotSupportedError\");\n      }\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype) break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n      if (!nativePrototype) {\n        throw new Error(\"NotSupportedError\");\n      }\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n      [ \"createdCallback\", \"attachedCallback\", \"detachedCallback\", \"attributeChangedCallback\" ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f) return;\n        newPrototype[name] = function() {\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n      var p = {\n        prototype: newPrototype\n      };\n      if (extendsOption) p.extends = extendsOption;\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      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n      var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);\n      return CustomElementConstructor;\n    };\n    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"registerElement\" ]);\n  }\n  forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ \"appendChild\", \"compareDocumentPosition\", \"contains\", \"getElementsByClassName\", \"getElementsByTagName\", \"getElementsByTagNameNS\", \"insertBefore\", \"querySelector\", \"querySelectorAll\", \"removeChild\", \"replaceChild\" ].concat(matchesNames));\n  forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"adoptNode\", \"importNode\", \"contains\", \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"elementFromPoint\", \"getElementById\", \"getElementsByName\", \"getSelection\" ]);\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation) return implementation;\n      implementation = new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n  registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(\"\"));\n  if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);\n  wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\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  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  wrapImplMethod(DOMImplementation, \"createDocumentType\");\n  wrapImplMethod(DOMImplementation, \"createDocument\");\n  wrapImplMethod(DOMImplementation, \"createHTMLDocument\");\n  forwardImplMethod(DOMImplementation, \"hasFeature\");\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n  forwardMethodsToWrapper([ window.DOMImplementation ], [ \"createDocumentType\", \"createDocument\", \"createHTMLDocument\", \"hasFeature\" ]);\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);\n    };\n  }\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n  delete window.getComputedStyle;\n  delete window.getDefaultComputedStyle;\n  delete window.getSelection;\n  [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ].forEach(function(name) {\n    OriginalWindow.prototype[name] = function() {\n      var w = wrap(this || window);\n      return w[name].apply(w, arguments);\n    };\n    delete window[name];\n  });\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n    };\n  }\n  registerWrapper(OriginalWindow, Window, window);\n  scope.wrappers.Window = Window;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var unwrap = scope.unwrap;\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n  var OriginalFormData = window.FormData;\n  if (!OriginalFormData) return;\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  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n  scope.wrappers.FormData = FormData;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var originalSend = XMLHttpRequest.prototype.send;\n  XMLHttpRequest.prototype.send = function(obj) {\n    return originalSend.call(this, unwrapIfNeeded(obj));\n  };\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var isWrapperFor = scope.isWrapperFor;\n  var elements = {\n    a: \"HTMLAnchorElement\",\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    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    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  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor) return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n  Object.keys(elements).forEach(overrideConstructor);\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name];\n  });\n})(window.ShadowDOMPolyfill);"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/bower.json",
    "content": "{\n  \"name\": \"webcomponentsjs\",\n  \"main\": \"webcomponents.js\",\n  \"version\": \"0.5.2\",\n  \"homepage\": \"http://webcomponents.org\",\n  \"authors\": [\n    \"The Polymer Authors\"\n  ],\n  \"keywords\": [\n    \"webcomponents\"\n  ],\n  \"license\": \"BSD\",\n  \"ignore\": []\n}"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/build.log",
    "content": "BUILD LOG\n---------\nBuild Time: 2014-12-11T12:45:39-0800\n\nNODEJS INFORMATION\n==================\nnodejs: v0.10.33\ngulp: 3.8.10\ngulp-audit: 1.0.0\ngulp-concat: 2.4.2\ngulp-header: 1.2.2\ngulp-uglify: 1.0.2\nrun-sequence: 1.0.2\nweb-component-tester: 2.0.1\n\nREPO REVISIONS\n==============\nwebcomponentsjs: d83cc676df65dc61db22bca47d33da679391f5a0\n\nBUILD HASHES\n============\nCustomElements.js: b221f7741515b570df70fd1c50b398bb8f731b81\nCustomElements.min.js: 6a55999d9f4895525d35c5248e2f409f176162a6\nHTMLImports.js: 72dd4ea891dc3c5256c569992288eca9f5c5e450\nHTMLImports.min.js: 1677819e83722c7d163a571598d8d36cdc8ae690\nShadowDOM.js: a1cce2304031d5acb440978761b346b98d06e1a4\nShadowDOM.min.js: 9371908d889872eb7e8e320e8877c394eb906732\nwebcomponents-lite.js: 7b6c8fbd7f67a2bd04b797a72e808b16ab54518f\nwebcomponents-lite.min.js: 41b033fa7e52bf612686f222d5a496d48bd2909c\nwebcomponents.js: 523f45c65c94d71543729f7e3d32ec4b7a48ae5b\nwebcomponents.min.js: 645b22d4c22bf6eaf470bc03d819d396661ac439"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/package.json",
    "content": "{\n  \"name\": \"webcomponents.js\",\n  \"version\": \"0.5.1-1\",\n  \"description\": \"webcomponents.js\",\n  \"main\": \"gulpfile.js\",\n  \"directories\": {\n    \"test\": \"tests\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/webcomponents/webcomponentsjs.git\"\n  },\n  \"author\": \"The Polymer Authors\",\n  \"license\": {\n    \"type\": \"BSD-3-Clause\",\n    \"url\": \"http://polymer.github.io/LICENSE.txt\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/webcomponents/webcomponentsjs/issues\"\n  },\n  \"homepage\": \"http://webcomponents.org\",\n  \"devDependencies\": {\n    \"gulp\": \"^3.8.8\",\n    \"gulp-audit\": \"^1.0.0\",\n    \"gulp-concat\": \"^2.4.1\",\n    \"gulp-header\": \"^1.1.1\",\n    \"gulp-uglify\": \"^1.0.1\",\n    \"run-sequence\": \"^1.0.1\",\n    \"web-component-tester\": \"*\"\n  }\n}\n"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/webcomponents-lite.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nwindow.WebComponents = window.WebComponents || {};\n\n(function(scope) {\n  var flags = scope.flags || {};\n  var file = \"webcomponents.js\";\n  var script = document.querySelector('script[src*=\"' + file + '\"]');\n  var flags = {};\n  if (!flags.noOpts) {\n    location.search.slice(1).split(\"&\").forEach(function(o) {\n      o = o.split(\"=\");\n      o[0] && (flags[o[0]] = o[1] || true);\n    });\n    if (script) {\n      for (var i = 0, a; a = script.attributes[i]; i++) {\n        if (a.name !== \"src\") {\n          flags[a.name] = a.value || true;\n        }\n      }\n    }\n    if (flags.log) {\n      var parts = flags.log.split(\",\");\n      flags.log = {};\n      parts.forEach(function(f) {\n        flags.log[f] = true;\n      });\n    } else {\n      flags.log = {};\n    }\n  }\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  if (flags.register) {\n    window.CustomElements = window.CustomElements || {\n      flags: {}\n    };\n    window.CustomElements.flags.register = flags.register;\n  }\n  scope.flags = flags;\n})(WebComponents);\n\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.HTMLImports = window.HTMLImports || {\n  flags: {}\n};\n\n(function(scope) {\n  var IMPORT_LINK_TYPE = \"import\";\n  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement(\"link\"));\n  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\n  var wrap = function(node) {\n    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n  };\n  var rootDocument = wrap(document);\n  var currentScriptDescriptor = {\n    get: function() {\n      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== \"complete\" ? document.scripts[document.scripts.length - 1] : null);\n      return wrap(script);\n    },\n    configurable: true\n  };\n  Object.defineProperty(document, \"_currentScript\", currentScriptDescriptor);\n  Object.defineProperty(rootDocument, \"_currentScript\", currentScriptDescriptor);\n  var isIE = /Trident|Edge/.test(navigator.userAgent);\n  function whenReady(callback, doc) {\n    doc = doc || rootDocument;\n    whenDocumentReady(function() {\n      watchImportsLoad(callback, doc);\n    }, doc);\n  }\n  var requiredReadyState = isIE ? \"complete\" : \"interactive\";\n  var READY_EVENT = \"readystatechange\";\n  function isDocumentReady(doc) {\n    return doc.readyState === \"complete\" || doc.readyState === requiredReadyState;\n  }\n  function whenDocumentReady(callback, doc) {\n    if (!isDocumentReady(doc)) {\n      var checkReady = function() {\n        if (doc.readyState === \"complete\" || 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  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n  function 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 && callback) {\n        callback();\n      }\n    }\n    function loadedImport(e) {\n      markTargetLoaded(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            target: imp\n          });\n        } else {\n          imp.addEventListener(\"load\", loadedImport);\n          imp.addEventListener(\"error\", loadedImport);\n        }\n      }\n    } else {\n      checkDone();\n    }\n  }\n  function isImportLoaded(link) {\n    return useNative ? link.__loaded || link.import && link.import.readyState !== \"loading\" : link.__importParsed;\n  }\n  if (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, {\n      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    function isImport(element) {\n      return element.localName === \"link\" && element.rel === \"import\";\n    }\n    function handleImport(element) {\n      var loaded = element.import;\n      if (loaded) {\n        markTargetLoaded({\n          target: element\n        });\n      } else {\n        element.addEventListener(\"load\", markTargetLoaded);\n        element.addEventListener(\"error\", markTargetLoaded);\n      }\n    }\n    (function() {\n      if (document.readyState === \"loading\") {\n        var imports = document.querySelectorAll(\"link[rel=import]\");\n        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {\n          handleImport(imp);\n        }\n      }\n    })();\n  }\n  whenReady(function() {\n    HTMLImports.ready = true;\n    HTMLImports.readyTime = new Date().getTime();\n    rootDocument.dispatchEvent(new CustomEvent(\"HTMLImportsLoaded\", {\n      bubbles: true\n    }));\n  });\n  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n  scope.useNative = useNative;\n  scope.rootDocument = rootDocument;\n  scope.whenReady = whenReady;\n  scope.isIE = isIE;\n})(HTMLImports);\n\n(function(scope) {\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n})(HTMLImports);\n\nHTMLImports.addModule(function(scope) {\n  var CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n  var CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n  var 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  scope.path = path;\n});\n\nHTMLImports.addModule(function(scope) {\n  xhr = {\n    async: true,\n    ok: function(request) {\n      return request.status >= 200 && request.status < 300 || request.status === 304 || 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          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = locationHeader.substr(0, 1) === \"/\" ? location.origin + locationHeader : locationHeader;\n          }\n          next.call(nextContext, !xhr.ok(request) && request, 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  scope.xhr = xhr;\n});\n\nHTMLImports.addModule(function(scope) {\n  var xhr = scope.xhr;\n  var flags = scope.flags;\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  Loader.prototype = {\n    addNodes: function(nodes) {\n      this.inflight += nodes.length;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        this.require(n);\n      }\n      this.checkDone();\n    },\n    addNode: function(node) {\n      this.inflight++;\n      this.require(node);\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      elt.__nodeUrl = url;\n      if (!this.dedupe(url, elt)) {\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        this.pending[url].push(elt);\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        this.tail();\n        return true;\n      }\n      this.pending[url] = [ elt ];\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log(\"fetch\", url, elt);\n      if (url.match(/^data:/)) {\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      }\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        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  scope.Loader = Loader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var Observer = function(addCallback) {\n    this.addCallback = addCallback;\n    this.mo = new MutationObserver(this.handler.bind(this));\n  };\n  Observer.prototype = {\n    handler: function(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          this.addedNodes(m.addedNodes);\n        }\n      }\n    },\n    addedNodes: function(nodes) {\n      if (this.addCallback) {\n        this.addCallback(nodes);\n      }\n      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {\n        if (n.children && n.children.length) {\n          this.addedNodes(n.children);\n        }\n      }\n    },\n    observe: function(root) {\n      this.mo.observe(root, {\n        childList: true,\n        subtree: true\n      });\n    }\n  };\n  scope.Observer = Observer;\n});\n\nHTMLImports.addModule(function(scope) {\n  var path = scope.path;\n  var rootDocument = scope.rootDocument;\n  var flags = scope.flags;\n  var isIE = scope.isIE;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = \"link[rel=\" + IMPORT_LINK_TYPE + \"]\";\n  var importParser = {\n    documentSelectors: IMPORT_SELECTOR,\n    importsSelectors: [ IMPORT_SELECTOR, \"link[rel=stylesheet]\", \"style\", \"script:not([type])\", 'script[type=\"text/javascript\"]' ].join(\",\"),\n    map: {\n      link: \"parseLink\",\n      script: \"parseScript\",\n      style: \"parseStyle\"\n    },\n    dynamicElements: [],\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    parseDynamic: function(elt, quiet) {\n      this.dynamicElements.push(elt);\n      if (!quiet) {\n        this.parseNext();\n      }\n    },\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      this.markDynamicParsingComplete(elt);\n      if (elt.__importElement) {\n        elt.__importElement.__importParsed = true;\n        this.markDynamicParsingComplete(elt.__importElement);\n      }\n      this.parsingElement = null;\n      flags.parse && console.log(\"completed\", elt);\n    },\n    markDynamicParsingComplete: function(elt) {\n      var i = this.dynamicElements.indexOf(elt);\n      if (i >= 0) {\n        this.dynamicElements.splice(i, 1);\n      }\n    },\n    parseImport: function(elt) {\n      if (HTMLImports.__importsParsingHook) {\n        HTMLImports.__importsParsingHook(elt);\n      }\n      if (elt.import) {\n        elt.import.__importParsed = true;\n      }\n      this.markParsingComplete(elt);\n      if (elt.__resource && !elt.__error) {\n        elt.dispatchEvent(new CustomEvent(\"load\", {\n          bubbles: false\n        }));\n      } else {\n        elt.dispatchEvent(new CustomEvent(\"error\", {\n          bubbles: false\n        }));\n      }\n      if (elt.__pending) {\n        var fn;\n        while (elt.__pending.length) {\n          fn = elt.__pending.shift();\n          if (fn) {\n            fn({\n              target: elt\n            });\n          }\n        }\n      }\n      this.parseNext();\n    },\n    parseLink: function(linkElt) {\n      if (nodeIsImport(linkElt)) {\n        this.parseImport(linkElt);\n      } else {\n        linkElt.href = linkElt.href;\n        this.parseGeneric(linkElt);\n      }\n    },\n    parseStyle: function(elt) {\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      port.parentNode.insertBefore(elt, port);\n    },\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      if (isIE && elt.localName === \"style\") {\n        var fakeLoad = false;\n        if (elt.textContent.indexOf(\"@import\") == -1) {\n          fakeLoad = true;\n        } else if (elt.sheet) {\n          fakeLoad = true;\n          var csr = elt.sheet.cssRules;\n          var len = csr ? csr.length : 0;\n          for (var i = 0, r; i < len && (r = csr[i]); i++) {\n            if (r.type === CSSRule.IMPORT_RULE) {\n              fakeLoad = fakeLoad && Boolean(r.styleSheet);\n            }\n          }\n        }\n        if (fakeLoad) {\n          elt.dispatchEvent(new CustomEvent(\"load\", {\n            bubbles: false\n          }));\n        }\n      }\n    },\n    parseScript: function(scriptElt) {\n      var script = document.createElement(\"script\");\n      script.__importElement = scriptElt;\n      script.src = scriptElt.src ? scriptElt.src : 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    nextToParse: function() {\n      this._mayParse = [];\n      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());\n    },\n    nextToParseInDoc: function(doc, link) {\n      if (doc && this._mayParse.indexOf(doc) < 0) {\n        this._mayParse.push(doc);\n        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {\n          if (!this.isParsed(n)) {\n            if (this.hasResource(n)) {\n              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n            } else {\n              return;\n            }\n          }\n        }\n      }\n      return link;\n    },\n    nextToParseDynamic: function() {\n      return this.dynamicElements[0];\n    },\n    parseSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;\n    },\n    isParsed: function(node) {\n      return node.__importParsed;\n    },\n    needsDynamicParsing: function(elt) {\n      return this.dynamicElements.indexOf(elt) >= 0;\n    },\n    hasResource: function(node) {\n      if (nodeIsImport(node) && node.import === undefined) {\n        return false;\n      }\n      return true;\n    }\n  };\n  function nodeIsImport(elt) {\n    return elt.localName === \"link\" && elt.rel === IMPORT_LINK_TYPE;\n  }\n  function generateScriptDataUrl(script) {\n    var scriptContent = generateScriptContent(script);\n    return \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(scriptContent);\n  }\n  function generateScriptContent(script) {\n    return script.textContent + generateSourceMapHint(script);\n  }\n  function generateSourceMapHint(script) {\n    var owner = script.ownerDocument;\n    owner.__importedScripts = owner.__importedScripts || 0;\n    var moniker = script.ownerDocument.baseURI;\n    var num = owner.__importedScripts ? \"-\" + owner.__importedScripts : \"\";\n    owner.__importedScripts++;\n    return \"\\n//# sourceURL=\" + moniker + num + \".js\\n\";\n  }\n  function cloneStyle(style) {\n    var clone = style.ownerDocument.createElement(\"style\");\n    clone.textContent = style.textContent;\n    path.resolveUrlsInStyle(clone);\n    return clone;\n  }\n  scope.parser = importParser;\n  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;\n});\n\nHTMLImports.addModule(function(scope) {\n  var flags = scope.flags;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;\n  var rootDocument = scope.rootDocument;\n  var Loader = scope.Loader;\n  var Observer = scope.Observer;\n  var parser = scope.parser;\n  var importer = {\n    documents: {},\n    documentPreloadSelectors: IMPORT_SELECTOR,\n    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(\",\"),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log(\"loaded\", url, elt);\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isImportLink(elt)) {\n        var doc = this.documents[url];\n        if (doc === undefined) {\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            this.bootDocument(doc);\n          }\n          this.documents[url] = doc;\n        }\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observer.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));\n  importer.observer = new Observer();\n  function isImportLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n  function isLinkRel(elt, rel) {\n    return elt.localName === \"link\" && elt.getAttribute(\"rel\") === rel;\n  }\n  function makeDocument(resource, url) {\n    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    doc._URL = url;\n    var base = doc.createElement(\"base\");\n    base.setAttribute(\"href\", url);\n    if (!doc.baseURI) {\n      Object.defineProperty(doc, \"baseURI\", {\n        value: url\n      });\n    }\n    var meta = doc.createElement(\"meta\");\n    meta.setAttribute(\"charset\", \"utf-8\");\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    doc.body.innerHTML = resource;\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\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    Object.defineProperty(document, \"baseURI\", baseURIDescriptor);\n    Object.defineProperty(rootDocument, \"baseURI\", baseURIDescriptor);\n  }\n  scope.importer = importer;\n  scope.importLoader = importLoader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var parser = scope.parser;\n  var importer = scope.importer;\n  var dynamic = {\n    added: function(nodes) {\n      var owner, parsed;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        if (!owner) {\n          owner = n.ownerDocument;\n          parsed = parser.isParsed(owner);\n        }\n        loading = this.shouldLoadNode(n);\n        if (loading) {\n          importer.loadNode(n);\n        }\n        if (this.shouldParseNode(n) && parsed) {\n          parser.parseDynamic(n, loading);\n        }\n      }\n    },\n    shouldLoadNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));\n    },\n    shouldParseNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));\n    }\n  };\n  importer.observer.addCallback = dynamic.added.bind(dynamic);\n  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;\n});\n\n(function(scope) {\n  var initializeModules = scope.initializeModules;\n  var isIE = scope.isIE;\n  if (scope.useNative) {\n    return;\n  }\n  if (isIE && 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  initializeModules();\n  var rootDocument = scope.rootDocument;\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(rootDocument);\n  }\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\" && !window.attachEvent) {\n    bootstrap();\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", bootstrap);\n  }\n})(HTMLImports);\n\nwindow.CustomElements = window.CustomElements || {\n  flags: {}\n};\n\n(function(scope) {\n  var flags = scope.flags;\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n  scope.hasNative = Boolean(document.registerElement);\n  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n})(CustomElements);\n\nCustomElements.addModule(function(scope) {\n  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : \"none\";\n  function forSubtree(node, cb) {\n    findAllElements(node, function(e) {\n      if (cb(e)) {\n        return true;\n      }\n      forRoots(e, cb);\n    });\n    forRoots(node, cb);\n  }\n  function findAllElements(node, find, data) {\n    var e = node.firstElementChild;\n    if (!e) {\n      e = node.firstChild;\n      while (e && e.nodeType !== Node.ELEMENT_NODE) {\n        e = e.nextSibling;\n      }\n    }\n    while (e) {\n      if (find(e, data) !== true) {\n        findAllElements(e, find, data);\n      }\n      e = e.nextElementSibling;\n    }\n    return null;\n  }\n  function forRoots(node, cb) {\n    var root = node.shadowRoot;\n    while (root) {\n      forSubtree(root, cb);\n      root = root.olderShadowRoot;\n    }\n  }\n  var processingDocuments;\n  function forDocumentTree(doc, cb) {\n    processingDocuments = [];\n    _forDocumentTree(doc, cb);\n    processingDocuments = null;\n  }\n  function _forDocumentTree(doc, cb) {\n    doc = wrap(doc);\n    if (processingDocuments.indexOf(doc) >= 0) {\n      return;\n    }\n    processingDocuments.push(doc);\n    var imports = doc.querySelectorAll(\"link[rel=\" + IMPORT_LINK_TYPE + \"]\");\n    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {\n      if (n.import) {\n        _forDocumentTree(n.import, cb);\n      }\n    }\n    cb(doc);\n  }\n  scope.forDocumentTree = forDocumentTree;\n  scope.forSubtree = forSubtree;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  var forSubtree = scope.forSubtree;\n  var forDocumentTree = scope.forDocumentTree;\n  function addedNode(node) {\n    return added(node) || addedSubtree(node);\n  }\n  function added(node) {\n    if (scope.upgrade(node)) {\n      return true;\n    }\n    attached(node);\n  }\n  function addedSubtree(node) {\n    forSubtree(node, function(e) {\n      if (added(e)) {\n        return true;\n      }\n    });\n  }\n  function attachedNode(node) {\n    attached(node);\n    if (inDocument(node)) {\n      forSubtree(node, function(e) {\n        attached(e);\n      });\n    }\n  }\n  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;\n  scope.hasPolyfillMutations = hasPolyfillMutations;\n  var isPendingMutations = false;\n  var pendingMutations = [];\n  function deferMutation(fn) {\n    pendingMutations.push(fn);\n    if (!isPendingMutations) {\n      isPendingMutations = true;\n      setTimeout(takeMutations);\n    }\n  }\n  function takeMutations() {\n    isPendingMutations = false;\n    var $p = pendingMutations;\n    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {\n      p();\n    }\n    pendingMutations = [];\n  }\n  function attached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _attached(element);\n      });\n    } else {\n      _attached(element);\n    }\n  }\n  function _attached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (!element.__attached && inDocument(element)) {\n        element.__attached = true;\n        if (element.attachedCallback) {\n          element.attachedCallback();\n        }\n      }\n    }\n  }\n  function detachedNode(node) {\n    detached(node);\n    forSubtree(node, function(e) {\n      detached(e);\n    });\n  }\n  function detached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _detached(element);\n      });\n    } else {\n      _detached(element);\n    }\n  }\n  function _detached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (element.__attached && !inDocument(element)) {\n        element.__attached = false;\n        if (element.detachedCallback) {\n          element.detachedCallback();\n        }\n      }\n    }\n  }\n  function inDocument(element) {\n    var p = element;\n    var doc = wrap(document);\n    while (p) {\n      if (p == doc) {\n        return true;\n      }\n      p = p.parentNode || p.host;\n    }\n  }\n  function watchShadow(node) {\n    if (node.shadowRoot && !node.shadowRoot.__watched) {\n      flags.dom && console.log(\"watching shadow-root for: \", node.localName);\n      var root = node.shadowRoot;\n      while (root) {\n        observe(root);\n        root = root.olderShadowRoot;\n      }\n    }\n  }\n  function handler(mutations) {\n    if (flags.dom) {\n      var mx = mutations[0];\n      if (mx && mx.type === \"childList\" && mx.addedNodes) {\n        if (mx.addedNodes) {\n          var d = mx.addedNodes[0];\n          while (d && d !== document && !d.host) {\n            d = d.parentNode;\n          }\n          var u = d && (d.URL || d._URL || d.host && d.host.localName) || \"\";\n          u = u.split(\"/?\").shift().split(\"/\").pop();\n        }\n      }\n      console.group(\"mutations (%d) [%s]\", mutations.length, u || \"\");\n    }\n    mutations.forEach(function(mx) {\n      if (mx.type === \"childList\") {\n        forEach(mx.addedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          addedNode(n);\n        });\n        forEach(mx.removedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          detachedNode(n);\n        });\n      }\n    });\n    flags.dom && console.groupEnd();\n  }\n  function takeRecords(node) {\n    node = wrap(node);\n    if (!node) {\n      node = wrap(document);\n    }\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    var observer = node.__observer;\n    if (observer) {\n      handler(observer.takeRecords());\n      takeMutations();\n    }\n  }\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  function observe(inRoot) {\n    if (inRoot.__observer) {\n      return;\n    }\n    var observer = new MutationObserver(handler);\n    observer.observe(inRoot, {\n      childList: true,\n      subtree: true\n    });\n    inRoot.__observer = observer;\n  }\n  function upgradeDocument(doc) {\n    doc = wrap(doc);\n    flags.dom && console.group(\"upgradeDocument: \", doc.baseURI.split(\"/\").pop());\n    addedNode(doc);\n    observe(doc);\n    flags.dom && console.groupEnd();\n  }\n  function upgradeDocumentTree(doc) {\n    forDocumentTree(doc, upgradeDocument);\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  scope.watchShadow = watchShadow;\n  scope.upgradeDocumentTree = upgradeDocumentTree;\n  scope.upgradeSubtree = addedSubtree;\n  scope.upgradeAll = addedNode;\n  scope.attachedNode = attachedNode;\n  scope.takeRecords = takeRecords;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  function upgrade(node) {\n    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\n      var is = node.getAttribute(\"is\");\n      var definition = scope.getRegisteredDefinition(is || node.localName);\n      if (definition) {\n        if (is && definition.tag == node.localName) {\n          return upgradeWithDefinition(node, definition);\n        } else if (!is && !definition.extends) {\n          return upgradeWithDefinition(node, definition);\n        }\n      }\n    }\n  }\n  function upgradeWithDefinition(element, definition) {\n    flags.upgrade && console.group(\"upgrade:\", element.localName);\n    if (definition.is) {\n      element.setAttribute(\"is\", definition.is);\n    }\n    implementPrototype(element, definition);\n    element.__upgraded__ = true;\n    created(element);\n    scope.attachedNode(element);\n    scope.upgradeSubtree(element);\n    flags.upgrade && console.groupEnd();\n    return element;\n  }\n  function implementPrototype(element, definition) {\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n  function customMixin(inTarget, inSrc, inNative) {\n    var used = {};\n    var p = inSrc;\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, Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n  function created(element) {\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n  scope.upgrade = upgrade;\n  scope.upgradeWithDefinition = upgradeWithDefinition;\n  scope.implementPrototype = implementPrototype;\n});\n\nCustomElements.addModule(function(scope) {\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  var upgrade = scope.upgrade;\n  var upgradeWithDefinition = scope.upgradeWithDefinition;\n  var implementPrototype = scope.implementPrototype;\n  var useNative = scope.useNative;\n  function register(name, options) {\n    var definition = options || {};\n    if (!name) {\n      throw new Error(\"document.registerElement: first argument `name` must not be empty\");\n    }\n    if (name.indexOf(\"-\") < 0) {\n      throw new Error(\"document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '\" + String(name) + \"'.\");\n    }\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    if (getRegisteredDefinition(name)) {\n      throw new Error(\"DuplicateDefinitionError: a type with name '\" + String(name) + \"' is already registered\");\n    }\n    if (!definition.prototype) {\n      definition.prototype = Object.create(HTMLElement.prototype);\n    }\n    definition.__name = name.toLowerCase();\n    definition.lifecycle = definition.lifecycle || {};\n    definition.ancestry = ancestry(definition.extends);\n    resolveTagName(definition);\n    resolvePrototypeChain(definition);\n    overrideAttributeApi(definition.prototype);\n    registerDefinition(definition.__name, definition);\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    definition.prototype.constructor = definition.ctor;\n    if (scope.ready) {\n      upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n  function overrideAttributeApi(prototype) {\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  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 && newValue !== oldValue) {\n      this.attributeChangedCallback(name, oldValue, newValue);\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  var reservedTagList = [ \"annotation-xml\", \"color-profile\", \"font-face\", \"font-face-src\", \"font-face-uri\", \"font-face-format\", \"font-face-name\", \"missing-glyph\" ];\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([ extendee ]);\n    }\n    return [];\n  }\n  function resolveTagName(definition) {\n    var baseTag = definition.extends;\n    for (var i = 0, a; a = definition.ancestry[i]; i++) {\n      baseTag = a.is && a.tag;\n    }\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      definition.is = definition.__name;\n    }\n  }\n  function resolvePrototypeChain(definition) {\n    if (!Object.__proto__) {\n      var nativePrototype = HTMLElement.prototype;\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\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      definition.native = nativePrototype;\n    }\n  }\n  function instantiate(definition) {\n    return upgradeWithDefinition(domCreateElement(definition.tag), definition);\n  }\n  var registry = {};\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n  var HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n  function createElementNS(namespace, tag, typeExtension) {\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n  function createElement(tag, typeExtension) {\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n    var element;\n    if (typeExtension) {\n      element = createElement(tag);\n      element.setAttribute(\"is\", typeExtension);\n      return element;\n    }\n    element = domCreateElement(tag);\n    if (tag.indexOf(\"-\") >= 0) {\n      implementPrototype(element, HTMLElement);\n    }\n    return element;\n  }\n  function cloneNode(deep) {\n    var n = domCloneNode.call(this, deep);\n    upgrade(n);\n    return n;\n  }\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n  var domCloneNode = Node.prototype.cloneNode;\n  var isInstance;\n  if (!Object.__proto__ && !useNative) {\n    isInstance = function(obj, ctor) {\n      var p = obj;\n      while (p) {\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  document.registerElement = register;\n  document.createElement = createElement;\n  document.createElementNS = createElementNS;\n  Node.prototype.cloneNode = cloneNode;\n  scope.registry = registry;\n  scope.instanceof = isInstance;\n  scope.reservedTagList = reservedTagList;\n  scope.getRegisteredDefinition = getRegisteredDefinition;\n  document.register = document.registerElement;\n});\n\n(function(scope) {\n  var useNative = scope.useNative;\n  var initializeModules = scope.initializeModules;\n  var isIE11OrOlder = /Trident/.test(navigator.userAgent);\n  if (useNative) {\n    var nop = function() {};\n    scope.watchShadow = nop;\n    scope.upgrade = nop;\n    scope.upgradeAll = nop;\n    scope.upgradeDocumentTree = nop;\n    scope.upgradeSubtree = nop;\n    scope.takeRecords = nop;\n    scope.instanceof = function(obj, base) {\n      return obj instanceof base;\n    };\n  } else {\n    initializeModules();\n  }\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  if (!window.wrap) {\n    if (window.ShadowDOMPolyfill) {\n      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n    } else {\n      window.wrap = window.unwrap = function(node) {\n        return node;\n      };\n    }\n  }\n  function bootstrap() {\n    upgradeDocumentTree(wrap(document));\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        upgradeDocumentTree(wrap(elt.import));\n      };\n    }\n    CustomElements.ready = true;\n    setTimeout(function() {\n      CustomElements.readyTime = Date.now();\n      if (window.HTMLImports) {\n        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n      }\n      document.dispatchEvent(new CustomEvent(\"WebComponentsReady\", {\n        bubbles: true\n      }));\n    });\n  }\n  if (isIE11OrOlder && 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  if (document.readyState === \"complete\" || scope.flags.eager) {\n    bootstrap();\n  } else if (document.readyState === \"interactive\" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {\n    bootstrap();\n  } else {\n    var loadEvent = window.HTMLImports && !HTMLImports.ready ? \"HTMLImportsLoaded\" : \"DOMContentLoaded\";\n    window.addEventListener(loadEvent, bootstrap);\n  }\n})(window.CustomElements);\n\nif (typeof HTMLTemplateElement === \"undefined\") {\n  (function() {\n    var TEMPLATE_TAG = \"template\";\n    HTMLTemplateElement = function() {};\n    HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n    HTMLTemplateElement.decorate = function(template) {\n      if (!template.content) {\n        template.content = template.ownerDocument.createDocumentFragment();\n        var child;\n        while (child = template.firstChild) {\n          template.content.appendChild(child);\n        }\n      }\n    };\n    HTMLTemplateElement.bootstrap = function(doc) {\n      var templates = doc.querySelectorAll(TEMPLATE_TAG);\n      for (var i = 0, l = templates.length, t; i < l && (t = templates[i]); i++) {\n        HTMLTemplateElement.decorate(t);\n      }\n    };\n    addEventListener(\"DOMContentLoaded\", function() {\n      HTMLTemplateElement.bootstrap(document);\n    });\n  })();\n}\n\n(function(scope) {\n  var style = document.createElement(\"style\");\n  style.textContent = \"\" + \"body {\" + \"transition: opacity ease-in 0.2s;\" + \" } \\n\" + \"body[unresolved] {\" + \"opacity: 0; display: block; overflow: hidden; position: relative;\" + \" } \\n\";\n  var head = document.querySelector(\"head\");\n  head.insertBefore(style, head.firstChild);\n})(window.WebComponents);"
  },
  {
    "path": "build/mui/bower_components/webcomponentsjs/webcomponents.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nwindow.WebComponents = window.WebComponents || {};\n\n(function(scope) {\n  var flags = scope.flags || {};\n  var file = \"webcomponents.js\";\n  var script = document.querySelector('script[src*=\"' + file + '\"]');\n  var flags = {};\n  if (!flags.noOpts) {\n    location.search.slice(1).split(\"&\").forEach(function(o) {\n      o = o.split(\"=\");\n      o[0] && (flags[o[0]] = o[1] || true);\n    });\n    if (script) {\n      for (var i = 0, a; a = script.attributes[i]; i++) {\n        if (a.name !== \"src\") {\n          flags[a.name] = a.value || true;\n        }\n      }\n    }\n    if (flags.log) {\n      var parts = flags.log.split(\",\");\n      flags.log = {};\n      parts.forEach(function(f) {\n        flags.log[f] = true;\n      });\n    } else {\n      flags.log = {};\n    }\n  }\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  if (flags.register) {\n    window.CustomElements = window.CustomElements || {\n      flags: {}\n    };\n    window.CustomElements.flags.register = flags.register;\n  }\n  scope.flags = flags;\n})(WebComponents);\n\nif (WebComponents.flags.shadow) {\n  if (typeof WeakMap === \"undefined\") {\n    (function() {\n      var defineProperty = Object.defineProperty;\n      var counter = Date.now() % 1e9;\n      var WeakMap = function() {\n        this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n      };\n      WeakMap.prototype = {\n        set: function(key, value) {\n          var entry = key[this.name];\n          if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n            value: [ key, value ],\n            writable: true\n          });\n          return this;\n        },\n        get: function(key) {\n          var entry;\n          return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n        },\n        \"delete\": function(key) {\n          var entry = key[this.name];\n          if (!entry || entry[0] !== key) return false;\n          entry[0] = entry[1] = undefined;\n          return true;\n        },\n        has: function(key) {\n          var entry = key[this.name];\n          if (!entry) return false;\n          return entry[0] === key;\n        }\n      };\n      window.WeakMap = WeakMap;\n    })();\n  }\n  window.ShadowDOMPolyfill = {};\n  (function(scope) {\n    \"use strict\";\n    var constructorTable = new WeakMap();\n    var nativePrototypeTable = new WeakMap();\n    var wrappers = Object.create(null);\n    function detectEval() {\n      if (typeof chrome !== \"undefined\" && chrome.app && chrome.app.runtime) {\n        return false;\n      }\n      if (navigator.getDeviceStorage) {\n        return false;\n      }\n      try {\n        var f = new Function(\"return true;\");\n        return f();\n      } catch (ex) {\n        return false;\n      }\n    }\n    var hasEval = detectEval();\n    function assert(b) {\n      if (!b) throw new Error(\"Assertion failed\");\n    }\n    var defineProperty = Object.defineProperty;\n    var getOwnPropertyNames = Object.getOwnPropertyNames;\n    var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\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    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    function oneOf(object, propertyNames) {\n      for (var i = 0; i < propertyNames.length; i++) {\n        if (propertyNames[i] in object) return propertyNames[i];\n      }\n    }\n    var nonEnumerableDataDescriptor = {\n      value: undefined,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    };\n    function defineNonEnumerableDataProperty(object, name, value) {\n      nonEnumerableDataDescriptor.value = value;\n      defineProperty(object, name, nonEnumerableDataDescriptor);\n    }\n    getOwnPropertyNames(window);\n    function getWrapperConstructor(node) {\n      var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n      var wrapperConstructor = constructorTable.get(nativePrototype);\n      if (wrapperConstructor) return wrapperConstructor;\n      var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n      var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n      registerInternal(nativePrototype, GeneratedWrapper, node);\n      return GeneratedWrapper;\n    }\n    function addForwardingProperties(nativePrototype, wrapperPrototype) {\n      installProperty(nativePrototype, wrapperPrototype, true);\n    }\n    function registerInstanceProperties(wrapperPrototype, instanceObject) {\n      installProperty(instanceObject, wrapperPrototype, false);\n    }\n    var isFirefox = /Firefox/.test(navigator.userAgent);\n    var dummyDescriptor = {\n      get: function() {},\n      set: function(v) {},\n      configurable: true,\n      enumerable: true\n    };\n    function isEventHandlerName(name) {\n      return /^on[a-z]+$/.test(name);\n    }\n    function isIdentifierName(name) {\n      return /^\\w[a-zA-Z_0-9]*$/.test(name);\n    }\n    function getGetter(name) {\n      return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name) : function() {\n        return this.__impl4cf1e782hg__[name];\n      };\n    }\n    function getSetter(name) {\n      return hasEval && isIdentifierName(name) ? new Function(\"v\", \"this.__impl4cf1e782hg__.\" + name + \" = v\") : function(v) {\n        this.__impl4cf1e782hg__[name] = v;\n      };\n    }\n    function getMethod(name) {\n      return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name + \".apply(this.__impl4cf1e782hg__, arguments)\") : function() {\n        return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);\n      };\n    }\n    function getDescriptor(source, name) {\n      try {\n        return Object.getOwnPropertyDescriptor(source, name);\n      } catch (ex) {\n        return dummyDescriptor;\n      }\n    }\n    var isBrokenSafari = function() {\n      var descr = Object.getOwnPropertyDescriptor(Node.prototype, \"nodeType\");\n      return descr && !descr.get && !descr.set;\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_\") continue;\n        if (name in target) continue;\n        if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;\n        if (isFirefox) {\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        var isEvent = isEventHandlerName(name);\n        if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);\n        if (descriptor.writable || descriptor.set || isBrokenSafari) {\n          if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);\n        }\n        defineProperty(target, name, {\n          get: getter,\n          set: setter,\n          configurable: descriptor.configurable,\n          enumerable: descriptor.enumerable\n        });\n      }\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    function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n      var wrapperPrototype = wrapperConstructor.prototype;\n      assert(constructorTable.get(nativePrototype) === undefined);\n      constructorTable.set(nativePrototype, wrapperConstructor);\n      nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n      addForwardingProperties(nativePrototype, wrapperPrototype);\n      if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);\n      defineNonEnumerableDataProperty(wrapperPrototype, \"constructor\", wrapperConstructor);\n      wrapperConstructor.prototype = wrapperPrototype;\n    }\n    function isWrapperFor(wrapperConstructor, nativeConstructor) {\n      return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;\n    }\n    function registerObject(object) {\n      var nativePrototype = Object.getPrototypeOf(object);\n      var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n      var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n      registerInternal(nativePrototype, GeneratedWrapper, object);\n      return GeneratedWrapper;\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      return GeneratedWrapper;\n    }\n    function isWrapper(object) {\n      return object && object.__impl4cf1e782hg__;\n    }\n    function isNative(object) {\n      return !isWrapper(object);\n    }\n    function wrap(impl) {\n      if (impl === null) return null;\n      assert(isNative(impl));\n      return impl.__wrapper8e3dd93a60__ || (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n    }\n    function unwrap(wrapper) {\n      if (wrapper === null) return null;\n      assert(isWrapper(wrapper));\n      return wrapper.__impl4cf1e782hg__;\n    }\n    function unsafeUnwrap(wrapper) {\n      return wrapper.__impl4cf1e782hg__;\n    }\n    function setWrapper(impl, wrapper) {\n      wrapper.__impl4cf1e782hg__ = impl;\n      impl.__wrapper8e3dd93a60__ = wrapper;\n    }\n    function unwrapIfNeeded(object) {\n      return object && isWrapper(object) ? unwrap(object) : object;\n    }\n    function wrapIfNeeded(object) {\n      return object && !isWrapper(object) ? wrap(object) : object;\n    }\n    function rewrap(node, wrapper) {\n      if (wrapper === null) return;\n      assert(isNative(node));\n      assert(wrapper === undefined || isWrapper(wrapper));\n      node.__wrapper8e3dd93a60__ = wrapper;\n    }\n    var getterDescriptor = {\n      get: undefined,\n      configurable: true,\n      enumerable: true\n    };\n    function defineGetter(constructor, name, getter) {\n      getterDescriptor.get = getter;\n      defineProperty(constructor.prototype, name, getterDescriptor);\n    }\n    function defineWrapGetter(constructor, name) {\n      defineGetter(constructor, name, function() {\n        return wrap(this.__impl4cf1e782hg__[name]);\n      });\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    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  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    function newSplice(index, removed, addedCount) {\n      return {\n        index: index,\n        removed: removed,\n        addedCount: addedCount\n      };\n    }\n    var EDIT_LEAVE = 0;\n    var EDIT_UPDATE = 1;\n    var EDIT_ADD = 2;\n    var EDIT_DELETE = 3;\n    function ArraySplice() {}\n    ArraySplice.prototype = {\n      calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n        var rowCount = oldEnd - oldStart + 1;\n        var columnCount = currentEnd - currentStart + 1;\n        var distances = new Array(rowCount);\n        for (var i = 0; i < rowCount; i++) {\n          distances[i] = new Array(columnCount);\n          distances[i][0] = i;\n        }\n        for (var j = 0; j < columnCount; j++) distances[0][j] = j;\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])) distances[i][j] = distances[i - 1][j - 1]; 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        return distances;\n      },\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          var min;\n          if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;\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        edits.reverse();\n        return edits;\n      },\n      calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n        var prefixCount = 0;\n        var suffixCount = 0;\n        var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n        if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);\n        if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n        currentStart += prefixCount;\n        oldStart += prefixCount;\n        currentEnd -= suffixCount;\n        oldEnd -= suffixCount;\n        if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];\n        if (currentStart == currentEnd) {\n          var splice = newSplice(currentStart, [], 0);\n          while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);\n          return [ splice ];\n        } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n        var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));\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            index++;\n            oldIndex++;\n            break;\n\n           case EDIT_UPDATE:\n            if (!splice) splice = newSplice(index, [], 0);\n            splice.addedCount++;\n            index++;\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n\n           case EDIT_ADD:\n            if (!splice) splice = newSplice(index, [], 0);\n            splice.addedCount++;\n            index++;\n            break;\n\n           case EDIT_DELETE:\n            if (!splice) splice = newSplice(index, [], 0);\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          }\n        }\n        if (splice) {\n          splices.push(splice);\n        }\n        return splices;\n      },\n      sharedPrefix: function(current, old, searchLength) {\n        for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;\n        return searchLength;\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])) count++;\n        return count;\n      },\n      calculateSplices: function(current, previous) {\n        return this.calcSplices(current, 0, current.length, previous, 0, previous.length);\n      },\n      equals: function(currentValue, previousValue) {\n        return currentValue === previousValue;\n      }\n    };\n    scope.ArraySplice = ArraySplice;\n  })(window.ShadowDOMPolyfill);\n  (function(context) {\n    \"use strict\";\n    var OriginalMutationObserver = window.MutationObserver;\n    var callbacks = [];\n    var pending = false;\n    var timerFunc;\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    if (OriginalMutationObserver) {\n      var counter = 1;\n      var observer = new OriginalMutationObserver(handle);\n      var textNode = document.createTextNode(counter);\n      observer.observe(textNode, {\n        characterData: true\n      });\n      timerFunc = function() {\n        counter = (counter + 1) % 2;\n        textNode.data = counter;\n      };\n    } else {\n      timerFunc = window.setTimeout;\n    }\n    function setEndOfMicrotask(func) {\n      callbacks.push(func);\n      if (pending) return;\n      pending = true;\n      timerFunc(handle, 0);\n    }\n    context.setEndOfMicrotask = setEndOfMicrotask;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var setEndOfMicrotask = scope.setEndOfMicrotask;\n    var wrapIfNeeded = scope.wrapIfNeeded;\n    var wrappers = scope.wrappers;\n    var registrationsTable = new WeakMap();\n    var globalMutationObservers = [];\n    var isScheduled = false;\n    function scheduleCallback(observer) {\n      if (observer.scheduled_) return;\n      observer.scheduled_ = true;\n      globalMutationObservers.push(observer);\n      if (isScheduled) return;\n      setEndOfMicrotask(notifyObservers);\n      isScheduled = true;\n    }\n    function notifyObservers() {\n      isScheduled = false;\n      while (globalMutationObservers.length) {\n        var notifyList = globalMutationObservers;\n        globalMutationObservers = [];\n        notifyList.sort(function(x, y) {\n          return x.uid_ - y.uid_;\n        });\n        for (var i = 0; i < notifyList.length; i++) {\n          var mo = notifyList[i];\n          mo.scheduled_ = false;\n          var queue = mo.takeRecords();\n          removeTransientObserversFor(mo);\n          if (queue.length) {\n            mo.callback_(queue, mo);\n          }\n        }\n      }\n    }\n    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    function registerTransientObservers(ancestor, node) {\n      for (;ancestor; ancestor = ancestor.parentNode) {\n        var registrations = registrationsTable.get(ancestor);\n        if (!registrations) continue;\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.options.subtree) registration.addTransientObserver(node);\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) return;\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          if (registration.observer === observer) registration.removeTransientObservers();\n        }\n      }\n    }\n    function enqueueMutation(target, type, data) {\n      var interestedObservers = Object.create(null);\n      var associatedStrings = Object.create(null);\n      for (var node = target; node; node = node.parentNode) {\n        var registrations = registrationsTable.get(node);\n        if (!registrations) continue;\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          if (type === \"attributes\" && !options.attributes) continue;\n          if (type === \"attributes\" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {\n            continue;\n          }\n          if (type === \"characterData\" && !options.characterData) continue;\n          if (type === \"childList\" && !options.childList) continue;\n          var observer = registration.observer;\n          interestedObservers[observer.uid_] = observer;\n          if (type === \"attributes\" && options.attributeOldValue || type === \"characterData\" && options.characterDataOldValue) {\n            associatedStrings[observer.uid_] = data.oldValue;\n          }\n        }\n      }\n      for (var uid in interestedObservers) {\n        var observer = interestedObservers[uid];\n        var record = new MutationRecord(type, target);\n        if (\"name\" in data && \"namespace\" in data) {\n          record.attributeName = data.name;\n          record.attributeNamespace = data.namespace;\n        }\n        if (data.addedNodes) record.addedNodes = data.addedNodes;\n        if (data.removedNodes) record.removedNodes = data.removedNodes;\n        if (data.previousSibling) record.previousSibling = data.previousSibling;\n        if (data.nextSibling) record.nextSibling = data.nextSibling;\n        if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];\n        scheduleCallback(observer);\n        observer.records_.push(record);\n      }\n    }\n    var slice = Array.prototype.slice;\n    function MutationObserverOptions(options) {\n      this.childList = !!options.childList;\n      this.subtree = !!options.subtree;\n      if (!(\"attributes\" in options) && (\"attributeOldValue\" in options || \"attributeFilter\" in options)) {\n        this.attributes = true;\n      } else {\n        this.attributes = !!options.attributes;\n      }\n      if (\"characterDataOldValue\" in options && !(\"characterData\" in options)) this.characterData = true; else this.characterData = !!options.characterData;\n      if (!this.attributes && (options.attributeOldValue || \"attributeFilter\" in options) || !this.characterData && options.characterDataOldValue) {\n        throw new TypeError();\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 || 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    var uidCounter = 0;\n    function MutationObserver(callback) {\n      this.callback_ = callback;\n      this.nodes_ = [];\n      this.records_ = [];\n      this.uid_ = ++uidCounter;\n      this.scheduled_ = false;\n    }\n    MutationObserver.prototype = {\n      constructor: MutationObserver,\n      observe: function(target, options) {\n        target = wrapIfNeeded(target);\n        var newOptions = new MutationObserverOptions(options);\n        var registration;\n        var registrations = registrationsTable.get(target);\n        if (!registrations) registrationsTable.set(target, registrations = []);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i].observer === this) {\n            registration = registrations[i];\n            registration.removeTransientObservers();\n            registration.options = newOptions;\n          }\n        }\n        if (!registration) {\n          registration = new Registration(this, target, newOptions);\n          registrations.push(registration);\n          this.nodes_.push(target);\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              registrations.splice(i, 1);\n              break;\n            }\n          }\n        }, this);\n        this.records_ = [];\n      },\n      takeRecords: function() {\n        var copyOfRecords = this.records_;\n        this.records_ = [];\n        return copyOfRecords;\n      }\n    };\n    function Registration(observer, target, options) {\n      this.observer = observer;\n      this.target = target;\n      this.options = options;\n      this.transientObservedNodes = [];\n    }\n    Registration.prototype = {\n      addTransientObserver: function(node) {\n        if (node === this.target) return;\n        scheduleCallback(this.observer);\n        this.transientObservedNodes.push(node);\n        var registrations = registrationsTable.get(node);\n        if (!registrations) registrationsTable.set(node, registrations = []);\n        registrations.push(this);\n      },\n      removeTransientObservers: function() {\n        var transientObservedNodes = this.transientObservedNodes;\n        this.transientObservedNodes = [];\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              break;\n            }\n          }\n        }\n      }\n    };\n    scope.enqueueMutation = enqueueMutation;\n    scope.registerTransientObservers = registerTransientObservers;\n    scope.wrappers.MutationObserver = MutationObserver;\n    scope.wrappers.MutationRecord = MutationRecord;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    function TreeScope(root, parent) {\n      this.root = root;\n      this.parent = parent;\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      contains: function(treeScope) {\n        for (;treeScope; treeScope = treeScope.parent) {\n          if (treeScope === this) return true;\n        }\n        return false;\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    function getTreeScope(node) {\n      if (node instanceof scope.wrappers.Window) {\n        debugger;\n      }\n      if (node.treeScope_) return node.treeScope_;\n      var parent = node.parentNode;\n      var treeScope;\n      if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);\n      return node.treeScope_ = treeScope;\n    }\n    scope.TreeScope = TreeScope;\n    scope.getTreeScope = getTreeScope;\n    scope.setTreeScope = setTreeScope;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    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    function isShadowRoot(node) {\n      return node instanceof wrappers.ShadowRoot;\n    }\n    function rootOfNode(node) {\n      return getTreeScope(node).root;\n    }\n    function getEventPath(node, event) {\n      var path = [];\n      var current = node;\n      path.push(current);\n      while (current) {\n        var destinationInsertionPoints = getDestinationInsertionPoints(current);\n        if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n          for (var i = 0; i < destinationInsertionPoints.length; i++) {\n            var insertionPoint = destinationInsertionPoints[i];\n            if (isShadowInsertionPoint(insertionPoint)) {\n              var shadowRoot = rootOfNode(insertionPoint);\n              var olderShadowRoot = shadowRoot.olderShadowRoot;\n              if (olderShadowRoot) path.push(olderShadowRoot);\n            }\n            path.push(insertionPoint);\n          }\n          current = destinationInsertionPoints[destinationInsertionPoints.length - 1];\n        } else {\n          if (isShadowRoot(current)) {\n            if (inSameTree(node, current) && eventMustBeStopped(event)) {\n              break;\n            }\n            current = current.host;\n            path.push(current);\n          } else {\n            current = current.parentNode;\n            if (current) path.push(current);\n          }\n        }\n      }\n      return path;\n    }\n    function eventMustBeStopped(event) {\n      if (!event) return false;\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    function isShadowInsertionPoint(node) {\n      return node instanceof HTMLShadowElement;\n    }\n    function getDestinationInsertionPoints(node) {\n      return scope.getDestinationInsertionPoints(node);\n    }\n    function eventRetargetting(path, currentTarget) {\n      if (path.length === 0) return currentTarget;\n      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n      var currentTargetTree = getTreeScope(currentTarget);\n      var originalTarget = path[0];\n      var originalTargetTree = getTreeScope(originalTarget);\n      var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n      for (var i = 0; i < path.length; i++) {\n        var node = path[i];\n        if (getTreeScope(node) === relativeTargetTree) return node;\n      }\n      return path[path.length - 1];\n    }\n    function getTreeScopeAncestors(treeScope) {\n      var ancestors = [];\n      for (;treeScope; treeScope = treeScope.parent) {\n        ancestors.push(treeScope);\n      }\n      return ancestors;\n    }\n    function lowestCommonInclusiveAncestor(tsA, tsB) {\n      var ancestorsA = getTreeScopeAncestors(tsA);\n      var ancestorsB = getTreeScopeAncestors(tsB);\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) result = a; else break;\n      }\n      return result;\n    }\n    function getTreeScopeRoot(ts) {\n      if (!ts.parent) return ts;\n      return getTreeScopeRoot(ts.parent);\n    }\n    function relatedTargetResolution(event, currentTarget, relatedTarget) {\n      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n      var currentTargetTree = getTreeScope(currentTarget);\n      var relatedTargetTree = getTreeScope(relatedTarget);\n      var relatedTargetEventPath = getEventPath(relatedTarget, event);\n      var lowestCommonAncestorTree;\n      var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n      if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;\n      for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {\n        var adjustedRelatedTarget;\n        for (var i = 0; i < relatedTargetEventPath.length; i++) {\n          var node = relatedTargetEventPath[i];\n          if (getTreeScope(node) === commonAncestorTree) return node;\n        }\n      }\n      return null;\n    }\n    function inSameTree(a, b) {\n      return getTreeScope(a) === getTreeScope(b);\n    }\n    var NONE = 0;\n    var CAPTURING_PHASE = 1;\n    var AT_TARGET = 2;\n    var BUBBLING_PHASE = 3;\n    var pendingError;\n    function dispatchOriginalEvent(originalEvent) {\n      if (handledEventsTable.get(originalEvent)) 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    function isLoadLikeEvent(event) {\n      switch (event.type) {\n       case \"load\":\n       case \"beforeunload\":\n       case \"unload\":\n        return true;\n      }\n      return false;\n    }\n    function dispatchEvent(event, originalWrapperTarget) {\n      if (currentlyDispatchingEvents.get(event)) throw new Error(\"InvalidStateError\");\n      currentlyDispatchingEvents.set(event, true);\n      scope.renderAllPending();\n      var eventPath;\n      var overrideTarget;\n      var win;\n      if (isLoadLikeEvent(event) && !event.bubbles) {\n        var doc = originalWrapperTarget;\n        if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n          overrideTarget = doc;\n          eventPath = [];\n        }\n      }\n      if (!eventPath) {\n        if (originalWrapperTarget instanceof wrappers.Window) {\n          win = originalWrapperTarget;\n          eventPath = [];\n        } else {\n          eventPath = getEventPath(originalWrapperTarget, event);\n          if (!isLoadLikeEvent(event)) {\n            var doc = eventPath[eventPath.length - 1];\n            if (doc instanceof wrappers.Document) win = doc.defaultView;\n          }\n        }\n      }\n      eventPathTable.set(event, eventPath);\n      if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n        if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n          dispatchBubbling(event, eventPath, win, overrideTarget);\n        }\n      }\n      eventPhaseTable.set(event, NONE);\n      currentTargetTable.delete(event, null);\n      currentlyDispatchingEvents.delete(event);\n      return event.defaultPrevented;\n    }\n    function dispatchCapturing(event, eventPath, win, overrideTarget) {\n      var phase = CAPTURING_PHASE;\n      if (win) {\n        if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;\n      }\n      for (var i = eventPath.length - 1; i > 0; i--) {\n        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;\n      }\n      return true;\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    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)) return;\n      }\n      if (win && eventPath.length > 0) {\n        invoke(win, event, phase, eventPath, overrideTarget);\n      }\n    }\n    function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n      var listeners = listenersTable.get(currentTarget);\n      if (!listeners) return true;\n      var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n      if (target === currentTarget) {\n        if (phase === CAPTURING_PHASE) return true;\n        if (phase === BUBBLING_PHASE) phase = AT_TARGET;\n      } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n        return true;\n      }\n      if (\"relatedTarget\" in event) {\n        var originalEvent = unwrap(event);\n        var unwrappedRelatedTarget = originalEvent.relatedTarget;\n        if (unwrappedRelatedTarget) {\n          if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {\n            var relatedTarget = wrap(unwrappedRelatedTarget);\n            var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);\n            if (adjusted === target) return true;\n          } else {\n            adjusted = null;\n          }\n          relatedTargetTable.set(event, adjusted);\n        }\n      }\n      eventPhaseTable.set(event, phase);\n      var type = event.type;\n      var anyRemoved = false;\n      targetTable.set(event, target);\n      currentTargetTable.set(event, currentTarget);\n      listeners.depth++;\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        if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {\n          continue;\n        }\n        try {\n          if (typeof listener.handler === \"function\") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);\n          if (stopImmediatePropagationTable.get(event)) return false;\n        } catch (ex) {\n          if (!pendingError) pendingError = ex;\n        }\n      }\n      listeners.depth--;\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) listeners.push(copy[i]);\n        }\n      }\n      return !stopPropagationTable.get(event);\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 && this.capture === that.capture;\n      },\n      get removed() {\n        return this.handler === null;\n      },\n      remove: function() {\n        this.handler = null;\n      }\n    };\n    var OriginalEvent = window.Event;\n    OriginalEvent.prototype.polymerBlackList_ = {\n      returnValue: true,\n      keyLocation: true\n    };\n    function Event(type, options) {\n      if (type instanceof OriginalEvent) {\n        var impl = type;\n        if (!OriginalBeforeUnloadEvent && impl.type === \"beforeunload\" && !(this instanceof BeforeUnloadEvent)) {\n          return new BeforeUnloadEvent(impl);\n        }\n        setWrapper(impl, this);\n      } else {\n        return wrap(constructEvent(OriginalEvent, \"Event\", type, options));\n      }\n    }\n    Event.prototype = {\n      get target() {\n        return targetTable.get(this);\n      },\n      get currentTarget() {\n        return currentTargetTable.get(this);\n      },\n      get eventPhase() {\n        return eventPhaseTable.get(this);\n      },\n      get path() {\n        var eventPath = eventPathTable.get(this);\n        if (!eventPath) return [];\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    function unwrapOptions(options) {\n      if (!options || !options.relatedTarget) return options;\n      return Object.create(options, {\n        relatedTarget: {\n          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) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));\n      };\n      GenericEvent.prototype = Object.create(SuperEvent.prototype);\n      if (prototype) mixin(GenericEvent.prototype, prototype);\n      if (OriginalEvent) {\n        try {\n          registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent(\"temp\"));\n        } catch (ex) {\n          registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));\n        }\n      }\n      return GenericEvent;\n    }\n    var UIEvent = registerGenericEvent(\"UIEvent\", Event);\n    var CustomEvent = registerGenericEvent(\"CustomEvent\", Event);\n    var relatedTargetProto = {\n      get relatedTarget() {\n        var relatedTarget = relatedTargetTable.get(this);\n        if (relatedTarget !== undefined) return relatedTarget;\n        return wrap(unwrap(this).relatedTarget);\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    var mouseEventProto = mixin({\n      initMouseEvent: getInitFunction(\"initMouseEvent\", 14)\n    }, relatedTargetProto);\n    var focusEventProto = mixin({\n      initFocusEvent: getInitFunction(\"initFocusEvent\", 5)\n    }, relatedTargetProto);\n    var MouseEvent = registerGenericEvent(\"MouseEvent\", UIEvent, mouseEventProto);\n    var FocusEvent = registerGenericEvent(\"FocusEvent\", UIEvent, focusEventProto);\n    var defaultInitDicts = Object.create(null);\n    var supportsEventConstructors = function() {\n      try {\n        new window.FocusEvent(\"focus\");\n      } catch (ex) {\n        return false;\n      }\n      return true;\n    }();\n    function constructEvent(OriginalEvent, name, type, options) {\n      if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));\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 ? options[key] : defaultDict[key];\n        if (key === \"relatedTarget\") v = unwrap(v);\n        args.push(v);\n      });\n      event[\"init\" + name].apply(event, args);\n      return event;\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        defaultInitDicts[name] = initDict;\n      };\n      configureEventConstructor(\"Event\", {\n        bubbles: false,\n        cancelable: false\n      });\n      configureEventConstructor(\"CustomEvent\", {\n        detail: null\n      }, \"Event\");\n      configureEventConstructor(\"UIEvent\", {\n        view: null,\n        detail: 0\n      }, \"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\", {\n        relatedTarget: null\n      }, \"UIEvent\");\n    }\n    var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\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    if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n    function isValidListener(fun) {\n      if (typeof fun === \"function\") return true;\n      return fun && fun.handleEvent;\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    var OriginalEventTarget = window.EventTarget;\n    function EventTarget(impl) {\n      setWrapper(impl, this);\n    }\n    var methodNames = [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ];\n    [ Node, Window ].forEach(function(constructor) {\n      var p = constructor.prototype;\n      methodNames.forEach(function(name) {\n        Object.defineProperty(p, name + \"_\", {\n          value: p[name]\n        });\n      });\n    });\n    function getTargetToListenAt(wrapper) {\n      if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;\n      return unwrap(wrapper);\n    }\n    EventTarget.prototype = {\n      addEventListener: function(type, fun, capture) {\n        if (!isValidListener(fun) || isMutationEvent(type)) return;\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          for (var i = 0; i < listeners.length; i++) {\n            if (listener.equals(listeners[i])) return;\n          }\n        }\n        listeners.push(listener);\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) 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        if (found && count === 1) {\n          var target = getTargetToListenAt(this);\n          target.removeEventListener_(type, dispatchOriginalEvent, true);\n        }\n      },\n      dispatchEvent: function(event) {\n        var nativeEvent = unwrap(event);\n        var eventType = nativeEvent.type;\n        handledEventsTable.set(nativeEvent, false);\n        scope.renderAllPending();\n        var tempListener;\n        if (!hasListenerInAncestors(this, eventType)) {\n          tempListener = function() {};\n          this.addEventListener(eventType, tempListener, true);\n        }\n        try {\n          return unwrap(this).dispatchEvent_(nativeEvent);\n        } finally {\n          if (tempListener) this.removeEventListener(eventType, tempListener, true);\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) return true;\n        }\n      }\n      return false;\n    }\n    function hasListenerInAncestors(target, type) {\n      for (var node = unwrap(target); node; node = node.parentNode) {\n        if (hasListener(wrap(node), type)) return true;\n      }\n      return false;\n    }\n    if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);\n    function wrapEventTargetMethods(constructors) {\n      forwardMethodsToWrapper(constructors, methodNames);\n    }\n    var originalElementFromPoint = document.elementFromPoint;\n    function elementFromPoint(self, document, x, y) {\n      scope.renderAllPending();\n      var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n      if (!element) return null;\n      var path = getEventPath(element, null);\n      var idx = path.lastIndexOf(self);\n      if (idx == -1) return null; else path = path.slice(0, idx);\n      return eventRetargetting(path, self);\n    }\n    function getEventHandlerGetter(name) {\n      return function() {\n        var inlineEventHandlers = eventHandlersTable.get(this);\n        return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;\n      };\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        var old = inlineEventHandlers[name];\n        if (old) this.removeEventListener(eventType, old.wrapped, false);\n        if (typeof value === \"function\") {\n          var wrapped = function(e) {\n            var rv = value.call(this, e);\n            if (rv === false) e.preventDefault(); else if (name === \"onbeforeunload\" && typeof rv === \"string\") e.returnValue = rv;\n          };\n          this.addEventListener(eventType, wrapped, false);\n          inlineEventHandlers[name] = {\n            value: value,\n            wrapped: wrapped\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  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalTouchEvent = window.TouchEvent;\n    if (!OriginalTouchEvent) return;\n    var nativeEvent;\n    try {\n      nativeEvent = document.createEvent(\"TouchEvent\");\n    } catch (ex) {\n      return;\n    }\n    var nonEnumDescriptor = {\n      enumerable: false\n    };\n    function nonEnum(obj, prop) {\n      Object.defineProperty(obj, prop, nonEnumDescriptor);\n    }\n    function Touch(impl) {\n      setWrapper(impl, this);\n    }\n    Touch.prototype = {\n      get target() {\n        return wrap(unsafeUnwrap(this).target);\n      }\n    };\n    var descr = {\n      configurable: true,\n      enumerable: true,\n      get: null\n    };\n    [ \"clientX\", \"clientY\", \"screenX\", \"screenY\", \"pageX\", \"pageY\", \"identifier\", \"webkitRadiusX\", \"webkitRadiusY\", \"webkitRotationAngle\", \"webkitForce\" ].forEach(function(name) {\n      descr.get = function() {\n        return unsafeUnwrap(this)[name];\n      };\n      Object.defineProperty(Touch.prototype, name, descr);\n    });\n    function TouchList() {\n      this.length = 0;\n      nonEnum(this, \"length\");\n    }\n    TouchList.prototype = {\n      item: function(index) {\n        return this[index];\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    function TouchEvent(impl) {\n      UIEvent.call(this, impl);\n    }\n    TouchEvent.prototype = Object.create(UIEvent.prototype);\n    mixin(TouchEvent.prototype, {\n      get touches() {\n        return wrapTouchList(unsafeUnwrap(this).touches);\n      },\n      get targetTouches() {\n        return wrapTouchList(unsafeUnwrap(this).targetTouches);\n      },\n      get changedTouches() {\n        return wrapTouchList(unsafeUnwrap(this).changedTouches);\n      },\n      initTouchEvent: function() {\n        throw new Error(\"Not implemented\");\n      }\n    });\n    registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n    scope.wrappers.Touch = Touch;\n    scope.wrappers.TouchEvent = TouchEvent;\n    scope.wrappers.TouchList = TouchList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var unsafeUnwrap = scope.unsafeUnwrap;\n    var wrap = scope.wrap;\n    var nonEnumDescriptor = {\n      enumerable: false\n    };\n    function nonEnum(obj, prop) {\n      Object.defineProperty(obj, prop, nonEnumDescriptor);\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    function wrapNodeList(list) {\n      if (list == null) 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    function addWrapNodeListMethod(wrapperConstructor, name) {\n      wrapperConstructor.prototype[name] = function() {\n        return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n      };\n    }\n    scope.wrappers.NodeList = NodeList;\n    scope.addWrapNodeListMethod = addWrapNodeListMethod;\n    scope.wrapNodeList = wrapNodeList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    scope.wrapHTMLCollection = scope.wrapNodeList;\n    scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    function assertIsNodeWrapper(node) {\n      assert(node instanceof Node);\n    }\n    function createOneElementNodeList(node) {\n      var nodes = new NodeList();\n      nodes[0] = node;\n      nodes.length = 1;\n      return nodes;\n    }\n    var surpressMutations = false;\n    function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n      enqueueMutation(parent, \"childList\", {\n        removedNodes: nodes,\n        previousSibling: node.previousSibling,\n        nextSibling: node.nextSibling\n      });\n    }\n    function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n      enqueueMutation(df, \"childList\", {\n        removedNodes: nodes\n      });\n    }\n    function collectNodes(node, parentNode, previousNode, nextNode) {\n      if (node instanceof DocumentFragment) {\n        var nodes = collectNodesForDocumentFragment(node);\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        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        if (previousNode) previousNode.nextSibling_ = nodes[0];\n        if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];\n        return nodes;\n      }\n      var nodes = createOneElementNodeList(node);\n      var oldParent = node.parentNode;\n      if (oldParent) {\n        oldParent.removeChild(node);\n      }\n      node.parentNode_ = parentNode;\n      node.previousSibling_ = previousNode;\n      node.nextSibling_ = nextNode;\n      if (previousNode) previousNode.nextSibling_ = node;\n      if (nextNode) nextNode.previousSibling_ = node;\n      return nodes;\n    }\n    function collectNodesNative(node) {\n      if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);\n      var nodes = createOneElementNodeList(node);\n      var oldParent = node.parentNode;\n      if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n      return nodes;\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    function snapshotNodeList(nodeList) {\n      return nodeList;\n    }\n    function nodeWasAdded(node, treeScope) {\n      setTreeScope(node, treeScope);\n      node.nodeIsInserted_();\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    function nodeWasRemoved(node) {\n      setTreeScope(node, new TreeScope(node, null));\n    }\n    function nodesWereRemoved(nodes) {\n      for (var i = 0; i < nodes.length; i++) {\n        nodeWasRemoved(nodes[i]);\n      }\n    }\n    function ensureSameOwnerDocument(parent, child) {\n      var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;\n      if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);\n    }\n    function adoptNodesIfNeeded(owner, nodes) {\n      if (!nodes.length) return;\n      var ownerDoc = owner.ownerDocument;\n      if (ownerDoc === nodes[0].ownerDocument) return;\n      for (var i = 0; i < nodes.length; i++) {\n        scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n      }\n    }\n    function unwrapNodesForInsertion(owner, nodes) {\n      adoptNodesIfNeeded(owner, nodes);\n      var length = nodes.length;\n      if (length === 1) return unwrap(nodes[0]);\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    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    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) originalRemoveChild.call(parentNode, childNode);\n          childWrapper.previousSibling_ = childWrapper.nextSibling_ = 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    function invalidateParent(node) {\n      var p = node.parentNode;\n      return p && p.invalidateShadowRenderer();\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    var originalImportNode = document.importNode;\n    var originalCloneNode = window.Node.prototype.cloneNode;\n    function cloneNode(node, deep, opt_doc) {\n      var clone;\n      if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n      if (deep) {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          clone.appendChild(cloneNode(child, true, opt_doc));\n        }\n        if (node instanceof wrappers.HTMLTemplateElement) {\n          var cloneContent = clone.content;\n          for (var child = node.content.firstChild; child; child = child.nextSibling) {\n            cloneContent.appendChild(cloneNode(child, true, opt_doc));\n          }\n        }\n      }\n      return clone;\n    }\n    function contains(self, child) {\n      if (!child || getTreeScope(self) !== getTreeScope(child)) return false;\n      for (var node = child; node; node = node.parentNode) {\n        if (node === self) return true;\n      }\n      return false;\n    }\n    var OriginalNode = window.Node;\n    function Node(original) {\n      assert(original instanceof OriginalNode);\n      EventTarget.call(this, original);\n      this.parentNode_ = undefined;\n      this.firstChild_ = undefined;\n      this.lastChild_ = undefined;\n      this.nextSibling_ = undefined;\n      this.previousSibling_ = undefined;\n      this.treeScope_ = undefined;\n    }\n    var OriginalDocumentFragment = window.DocumentFragment;\n    var originalAppendChild = OriginalNode.prototype.appendChild;\n    var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;\n    var originalInsertBefore = OriginalNode.prototype.insertBefore;\n    var originalRemoveChild = OriginalNode.prototype.removeChild;\n    var originalReplaceChild = OriginalNode.prototype.replaceChild;\n    var isIe = /Trident|Edge/.test(navigator.userAgent);\n    var removeChildOriginalHelper = isIe ? function(parent, child) {\n      try {\n        originalRemoveChild.call(parent, child);\n      } catch (ex) {\n        if (!(parent instanceof OriginalDocumentFragment)) throw ex;\n      }\n    } : function(parent, child) {\n      originalRemoveChild.call(parent, child);\n    };\n    Node.prototype = Object.create(EventTarget.prototype);\n    mixin(Node.prototype, {\n      appendChild: function(childWrapper) {\n        return this.insertBefore(childWrapper, null);\n      },\n      insertBefore: function(childWrapper, refWrapper) {\n        assertIsNodeWrapper(childWrapper);\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        refWrapper && assert(refWrapper.parentNode === this);\n        var nodes;\n        var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;\n        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);\n        if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n        if (useNative) {\n          ensureSameOwnerDocument(this, childWrapper);\n          clearChildNodes(this);\n          originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n        } else {\n          if (!previousNode) this.firstChild_ = nodes[0];\n          if (!refWrapper) {\n            this.lastChild_ = nodes[nodes.length - 1];\n            if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;\n          }\n          var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n          if (parentNode) {\n            originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);\n          } else {\n            adoptNodesIfNeeded(this, nodes);\n          }\n        }\n        enqueueMutation(this, \"childList\", {\n          addedNodes: nodes,\n          nextSibling: refWrapper,\n          previousSibling: previousNode\n        });\n        nodesWereAdded(nodes, this);\n        return childWrapper;\n      },\n      removeChild: function(childWrapper) {\n        assertIsNodeWrapper(childWrapper);\n        if (childWrapper.parentNode !== this) {\n          var found = false;\n          var childNodes = this.childNodes;\n          for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {\n            if (ieChild === childWrapper) {\n              found = true;\n              break;\n            }\n          }\n          if (!found) {\n            throw new Error(\"NotFoundError\");\n          }\n        }\n        var childNode = unwrap(childWrapper);\n        var childWrapperNextSibling = childWrapper.nextSibling;\n        var childWrapperPreviousSibling = childWrapper.previousSibling;\n        if (this.invalidateShadowRenderer()) {\n          var thisFirstChild = this.firstChild;\n          var thisLastChild = this.lastChild;\n          var parentNode = childNode.parentNode;\n          if (parentNode) removeChildOriginalHelper(parentNode, childNode);\n          if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;\n          if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;\n          if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n          if (childWrapperNextSibling) {\n            childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;\n          }\n          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;\n        } else {\n          clearChildNodes(this);\n          removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n        }\n        if (!surpressMutations) {\n          enqueueMutation(this, \"childList\", {\n            removedNodes: createOneElementNodeList(childWrapper),\n            nextSibling: childWrapperNextSibling,\n            previousSibling: childWrapperPreviousSibling\n          });\n        }\n        registerTransientObservers(this, childWrapper);\n        return childWrapper;\n      },\n      replaceChild: function(newChildWrapper, oldChildWrapper) {\n        assertIsNodeWrapper(newChildWrapper);\n        var oldChildNode;\n        if (isWrapper(oldChildWrapper)) {\n          oldChildNode = unwrap(oldChildWrapper);\n        } else {\n          oldChildNode = oldChildWrapper;\n          oldChildWrapper = wrap(oldChildNode);\n        }\n        if (oldChildWrapper.parentNode !== this) {\n          throw new Error(\"NotFoundError\");\n        }\n        var nextNode = oldChildWrapper.nextSibling;\n        var previousNode = oldChildWrapper.previousSibling;\n        var nodes;\n        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);\n        if (useNative) {\n          nodes = collectNodesNative(newChildWrapper);\n        } else {\n          if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;\n          nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n        }\n        if (!useNative) {\n          if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];\n          if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];\n          oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;\n          if (oldChildNode.parentNode) {\n            originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);\n          }\n        } else {\n          ensureSameOwnerDocument(this, newChildWrapper);\n          clearChildNodes(this);\n          originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);\n        }\n        enqueueMutation(this, \"childList\", {\n          addedNodes: nodes,\n          removedNodes: createOneElementNodeList(oldChildWrapper),\n          nextSibling: nextNode,\n          previousSibling: previousNode\n        });\n        nodeWasRemoved(oldChildWrapper);\n        nodesWereAdded(nodes, this);\n        return oldChildWrapper;\n      },\n      nodeIsInserted_: function() {\n        for (var child = this.firstChild; child; child = child.nextSibling) {\n          child.nodeIsInserted_();\n        }\n      },\n      hasChildNodes: function() {\n        return this.firstChild !== null;\n      },\n      get parentNode() {\n        return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n      },\n      get firstChild() {\n        return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n      },\n      get lastChild() {\n        return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n      },\n      get nextSibling() {\n        return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n      },\n      get previousSibling() {\n        return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\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      get textContent() {\n        var s = \"\";\n        for (var child = this.firstChild; child; child = child.nextSibling) {\n          if (child.nodeType != Node.COMMENT_NODE) {\n            s += child.textContent;\n          }\n        }\n        return s;\n      },\n      set textContent(textContent) {\n        if (textContent == null) textContent = \"\";\n        var removedNodes = snapshotNodeList(this.childNodes);\n        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        var addedNodes = snapshotNodeList(this.childNodes);\n        enqueueMutation(this, \"childList\", {\n          addedNodes: addedNodes,\n          removedNodes: removedNodes\n        });\n        nodesWereRemoved(removedNodes);\n        nodesWereAdded(addedNodes, this);\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      cloneNode: function(deep) {\n        return cloneNode(this, deep);\n      },\n      contains: function(child) {\n        return contains(this, wrapIfNeeded(child));\n      },\n      compareDocumentPosition: function(otherNode) {\n        return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));\n      },\n      normalize: function() {\n        var nodes = snapshotNodeList(this.childNodes);\n        var remNodes = [];\n        var s = \"\";\n        var modNode;\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) this.removeNode(n); else if (!modNode) modNode = 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.normalize();\n          }\n        }\n        if (modNode && remNodes.length) {\n          modNode.data += s;\n          cleanupNodes(remNodes);\n        }\n      }\n    });\n    defineWrapGetter(Node, \"ownerDocument\");\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    scope.cloneNode = cloneNode;\n    scope.nodeWasAdded = nodeWasAdded;\n    scope.nodeWasRemoved = nodeWasRemoved;\n    scope.nodesWereAdded = nodesWereAdded;\n    scope.nodesWereRemoved = nodesWereRemoved;\n    scope.originalInsertBefore = originalInsertBefore;\n    scope.originalRemoveChild = originalRemoveChild;\n    scope.snapshotNodeList = snapshotNodeList;\n    scope.wrappers.Node = Node;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var originalDocumentQuerySelector = document.querySelector;\n    var originalElementQuerySelector = document.documentElement.querySelector;\n    var originalDocumentQuerySelectorAll = document.querySelectorAll;\n    var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n    var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n    var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n    var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n    var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n    var OriginalElement = window.Element;\n    var OriginalDocument = window.HTMLDocument || window.Document;\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      return index;\n    }\n    function shimSelector(selector) {\n      return String(selector).replace(/\\/deep\\//g, \" \");\n    }\n    function findOne(node, selector) {\n      var m, el = node.firstElementChild;\n      while (el) {\n        if (el.matches(selector)) return el;\n        m = findOne(el, selector);\n        if (m) return m;\n        el = el.nextElementSibling;\n      }\n      return null;\n    }\n    function matchesSelector(el, selector) {\n      return el.matches(selector);\n    }\n    var XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n    function matchesTagName(el, localName, localNameLowerCase) {\n      var ln = el.localName;\n      return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n    }\n    function matchesEveryThing() {\n      return true;\n    }\n    function matchesLocalNameOnly(el, ns, localName) {\n      return el.localName === localName;\n    }\n    function matchesNameSpace(el, ns) {\n      return el.namespaceURI === ns;\n    }\n    function matchesLocalNameNS(el, ns, localName) {\n      return el.namespaceURI === ns && el.localName === localName;\n    }\n    function findElements(node, index, result, p, arg0, arg1) {\n      var el = node.firstElementChild;\n      while (el) {\n        if (p(el, arg0, arg1)) result[index++] = el;\n        index = findElements(el, index, result, p, arg0, arg1);\n        el = el.nextElementSibling;\n      }\n      return index;\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        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        return findElements(this, index, result, p, selector, null);\n      }\n      return filterNodeList(list, index, result, deep);\n    }\n    var SelectorsInterface = {\n      querySelector: function(selector) {\n        var shimmed = shimSelector(selector);\n        var deep = shimmed !== selector;\n        selector = shimmed;\n        var target = unsafeUnwrap(this);\n        var wrappedItem;\n        var root = getTreeScope(this).root;\n        if (root instanceof scope.wrappers.ShadowRoot) {\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          return findOne(this, selector);\n        }\n        if (!wrappedItem) {\n          return wrappedItem;\n        } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n          if (root instanceof scope.wrappers.ShadowRoot) {\n            return findOne(this, selector);\n          }\n        }\n        return wrappedItem;\n      },\n      querySelectorAll: function(selector) {\n        var shimmed = shimSelector(selector);\n        var deep = shimmed !== selector;\n        selector = shimmed;\n        var result = new NodeList();\n        result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);\n        return result;\n      }\n    };\n    function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {\n      var target = unsafeUnwrap(this);\n      var list;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        return findElements(this, index, result, p, localName, lowercase);\n      } else if (target instanceof OriginalElement) {\n        list = originalElementGetElementsByTagName.call(target, localName, lowercase);\n      } else if (target instanceof OriginalDocument) {\n        list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);\n      } else {\n        return findElements(this, index, result, p, localName, lowercase);\n      }\n      return filterNodeList(list, index, result, false);\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        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        return findElements(this, index, result, p, ns, localName);\n      }\n      return filterNodeList(list, index, result, false);\n    }\n    var GetElementsByInterface = {\n      getElementsByTagName: function(localName) {\n        var result = new HTMLCollection();\n        var match = localName === \"*\" ? matchesEveryThing : matchesTagName;\n        result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());\n        return result;\n      },\n      getElementsByClassName: function(className) {\n        return this.querySelectorAll(\".\" + className);\n      },\n      getElementsByTagNameNS: function(ns, localName) {\n        var result = new HTMLCollection();\n        var match = null;\n        if (ns === \"*\") {\n          match = localName === \"*\" ? matchesEveryThing : matchesLocalNameOnly;\n        } else {\n          match = localName === \"*\" ? matchesNameSpace : matchesLocalNameNS;\n        }\n        result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);\n        return result;\n      }\n    };\n    scope.GetElementsByInterface = GetElementsByInterface;\n    scope.SelectorsInterface = SelectorsInterface;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var NodeList = scope.wrappers.NodeList;\n    function forwardElement(node) {\n      while (node && node.nodeType !== Node.ELEMENT_NODE) {\n        node = node.nextSibling;\n      }\n      return node;\n    }\n    function backwardsElement(node) {\n      while (node && node.nodeType !== Node.ELEMENT_NODE) {\n        node = node.previousSibling;\n      }\n      return node;\n    }\n    var ParentNodeInterface = {\n      get firstElementChild() {\n        return forwardElement(this.firstChild);\n      },\n      get lastElementChild() {\n        return backwardsElement(this.lastChild);\n      },\n      get childElementCount() {\n        var count = 0;\n        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n          count++;\n        }\n        return count;\n      },\n      get children() {\n        var wrapperList = new NodeList();\n        var i = 0;\n        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n          wrapperList[i++] = child;\n        }\n        wrapperList.length = i;\n        return wrapperList;\n      },\n      remove: function() {\n        var p = this.parentNode;\n        if (p) p.removeChild(this);\n      }\n    };\n    var ChildNodeInterface = {\n      get nextElementSibling() {\n        return forwardElement(this.nextSibling);\n      },\n      get previousElementSibling() {\n        return backwardsElement(this.previousSibling);\n      }\n    };\n    scope.ChildNodeInterface = ChildNodeInterface;\n    scope.ParentNodeInterface = ParentNodeInterface;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalCharacterData = window.CharacterData;\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    mixin(CharacterData.prototype, ChildNodeInterface);\n    registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(\"\"));\n    scope.wrappers.CharacterData = CharacterData;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var CharacterData = scope.wrappers.CharacterData;\n    var enqueueMutation = scope.enqueueMutation;\n    var mixin = scope.mixin;\n    var registerWrapper = scope.registerWrapper;\n    function toUInt32(x) {\n      return x >>> 0;\n    }\n    var OriginalText = window.Text;\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) 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) this.parentNode.insertBefore(newTextNode, this.nextSibling);\n        return newTextNode;\n      }\n    });\n    registerWrapper(OriginalText, Text, document.createTextNode(\"\"));\n    scope.wrappers.Text = Text;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var setWrapper = scope.setWrapper;\n    var unsafeUnwrap = scope.unsafeUnwrap;\n    function invalidateClass(el) {\n      scope.invalidateRendererBasedOnAttribute(el, \"class\");\n    }\n    function DOMTokenList(impl, ownerElement) {\n      setWrapper(impl, this);\n      this.ownerElement_ = ownerElement;\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    scope.wrappers.DOMTokenList = DOMTokenList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalElement = window.Element;\n    var matchesNames = [ \"matches\", \"mozMatchesSelector\", \"msMatchesSelector\", \"webkitMatchesSelector\" ].filter(function(name) {\n      return OriginalElement.prototype[name];\n    });\n    var matchesName = matchesNames[0];\n    var originalMatches = OriginalElement.prototype[matchesName];\n    function invalidateRendererBasedOnAttribute(element, name) {\n      var p = element.parentNode;\n      if (!p || !p.shadowRoot) return;\n      var renderer = scope.getRendererForHost(p);\n      if (renderer.dependsOnAttribute(name)) renderer.invalidate();\n    }\n    function enqueAttributeChange(element, name, oldValue) {\n      enqueueMutation(element, \"attributes\", {\n        name: name,\n        namespace: null,\n        oldValue: oldValue\n      });\n    }\n    var classListTable = new WeakMap();\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        var renderer = scope.getRendererForHost(this);\n        renderer.invalidate();\n        return newShadowRoot;\n      },\n      get shadowRoot() {\n        return unsafeUnwrap(this).polymerShadowRoot_ || null;\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      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      matches: function(selector) {\n        return originalMatches.call(unsafeUnwrap(this), selector);\n      },\n      get classList() {\n        var list = classListTable.get(this);\n        if (!list) {\n          classListTable.set(this, list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n        }\n        return list;\n      },\n      get className() {\n        return unsafeUnwrap(this).className;\n      },\n      set className(v) {\n        this.setAttribute(\"class\", v);\n      },\n      get id() {\n        return unsafeUnwrap(this).id;\n      },\n      set id(v) {\n        this.setAttribute(\"id\", v);\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    if (OriginalElement.prototype.webkitCreateShadowRoot) {\n      Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n    }\n    mixin(Element.prototype, ChildNodeInterface);\n    mixin(Element.prototype, GetElementsByInterface);\n    mixin(Element.prototype, ParentNodeInterface);\n    mixin(Element.prototype, SelectorsInterface);\n    registerWrapper(OriginalElement, Element, document.createElementNS(null, \"x\"));\n    scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n    scope.matchesNames = matchesNames;\n    scope.wrappers.Element = Element;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var escapeAttrRegExp = /[&\\u00A0\"]/g;\n    var escapeDataRegExp = /[&\\u00A0<>]/g;\n    function escapeReplace(c) {\n      switch (c) {\n       case \"&\":\n        return \"&amp;\";\n\n       case \"<\":\n        return \"&lt;\";\n\n       case \">\":\n        return \"&gt;\";\n\n       case '\"':\n        return \"&quot;\";\n\n       case \" \":\n        return \"&nbsp;\";\n      }\n    }\n    function escapeAttr(s) {\n      return s.replace(escapeAttrRegExp, escapeReplace);\n    }\n    function escapeData(s) {\n      return s.replace(escapeDataRegExp, escapeReplace);\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    var voidElements = makeSet([ \"area\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"wbr\" ]);\n    var plaintextParents = makeSet([ \"style\", \"script\", \"xmp\", \"iframe\", \"noembed\", \"noframes\", \"plaintext\", \"noscript\" ]);\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]) return s;\n        return s + getInnerHTML(node) + \"</\" + tagName + \">\";\n\n       case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName]) 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    function getInnerHTML(node) {\n      if (node instanceof wrappers.HTMLTemplateElement) node = node.content;\n      var s = \"\";\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        s += getOuterHTML(child, node);\n      }\n      return s;\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    var oldIe = /MSIE/.test(navigator.userAgent);\n    var OriginalHTMLElement = window.HTMLElement;\n    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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        if (oldIe && plaintextParents[this.localName]) {\n          this.textContent = value;\n          return;\n        }\n        var removedNodes = snapshotNodeList(this.childNodes);\n        if (this.invalidateShadowRenderer()) {\n          if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);\n        } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {\n          setInnerHTML(this.content, value);\n        } else {\n          unsafeUnwrap(this).innerHTML = value;\n        }\n        var addedNodes = snapshotNodeList(this.childNodes);\n        enqueueMutation(this, \"childList\", {\n          addedNodes: addedNodes,\n          removedNodes: removedNodes\n        });\n        nodesWereRemoved(removedNodes);\n        nodesWereAdded(addedNodes, this);\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      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\n         case \"afterend\":\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n\n         case \"afterbegin\":\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n\n         case \"beforeend\":\n          contextElement = this;\n          refNode = null;\n          break;\n\n         default:\n          return;\n        }\n        var df = frag(contextElement, text);\n        contextElement.insertBefore(df, refNode);\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    function frag(contextElement, html) {\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    function getter(name) {\n      return function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name];\n      };\n    }\n    function getterRequiresRendering(name) {\n      defineGetter(HTMLElement, name, getter(name));\n    }\n    [ \"clientHeight\", \"clientLeft\", \"clientTop\", \"clientWidth\", \"offsetHeight\", \"offsetLeft\", \"offsetTop\", \"offsetWidth\", \"scrollHeight\", \"scrollWidth\" ].forEach(getterRequiresRendering);\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    [ \"scrollLeft\", \"scrollTop\" ].forEach(getterAndSetterRequiresRendering);\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    [ \"getBoundingClientRect\", \"getClientRects\", \"scrollIntoView\" ].forEach(methodRequiresRendering);\n    registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement(\"b\"));\n    scope.wrappers.HTMLElement = HTMLElement;\n    scope.getInnerHTML = getInnerHTML;\n    scope.setInnerHTML = setInnerHTML;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n    function HTMLCanvasElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\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    registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement(\"canvas\"));\n    scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var mixin = scope.mixin;\n    var registerWrapper = scope.registerWrapper;\n    var OriginalHTMLContentElement = window.HTMLContentElement;\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      get select() {\n        return this.getAttribute(\"select\");\n      },\n      set select(value) {\n        this.setAttribute(\"select\", value);\n      },\n      setAttribute: function(n, v) {\n        HTMLElement.prototype.setAttribute.call(this, n, v);\n        if (String(n).toLowerCase() === \"select\") this.invalidateShadowRenderer(true);\n      }\n    });\n    if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n    scope.wrappers.HTMLContentElement = HTMLContentElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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 OriginalHTMLFormElement = window.HTMLFormElement;\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        return wrapHTMLCollection(unwrap(this).elements);\n      }\n    });\n    registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement(\"form\"));\n    scope.wrappers.HTMLFormElement = HTMLFormElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var registerWrapper = scope.registerWrapper;\n    var unwrap = scope.unwrap;\n    var rewrap = scope.rewrap;\n    var OriginalHTMLImageElement = window.HTMLImageElement;\n    function HTMLImageElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n    registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement(\"img\"));\n    function Image(width, height) {\n      if (!(this instanceof Image)) {\n        throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n      }\n      var node = unwrap(document.createElement(\"img\"));\n      HTMLElement.call(this, node);\n      rewrap(node, this);\n      if (width !== undefined) node.width = width;\n      if (height !== undefined) node.height = height;\n    }\n    Image.prototype = HTMLImageElement.prototype;\n    scope.wrappers.HTMLImageElement = HTMLImageElement;\n    scope.wrappers.Image = Image;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var mixin = scope.mixin;\n    var NodeList = scope.wrappers.NodeList;\n    var registerWrapper = scope.registerWrapper;\n    var OriginalHTMLShadowElement = window.HTMLShadowElement;\n    function HTMLShadowElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n    HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n    if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n    scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var contentTable = new WeakMap();\n    var templateContentsOwnerTable = new WeakMap();\n    function getTemplateContentsOwner(doc) {\n      if (!doc.defaultView) return doc;\n      var d = templateContentsOwnerTable.get(doc);\n      if (!d) {\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    function extractContent(templateElement) {\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    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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    mixin(HTMLTemplateElement.prototype, {\n      constructor: HTMLTemplateElement,\n      get content() {\n        if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);\n        return contentTable.get(this);\n      }\n    });\n    if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n    scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var registerWrapper = scope.registerWrapper;\n    var OriginalHTMLMediaElement = window.HTMLMediaElement;\n    if (!OriginalHTMLMediaElement) return;\n    function HTMLMediaElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n    registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement(\"audio\"));\n    scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n    var registerWrapper = scope.registerWrapper;\n    var unwrap = scope.unwrap;\n    var rewrap = scope.rewrap;\n    var OriginalHTMLAudioElement = window.HTMLAudioElement;\n    if (!OriginalHTMLAudioElement) return;\n    function HTMLAudioElement(node) {\n      HTMLMediaElement.call(this, node);\n    }\n    HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n    registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement(\"audio\"));\n    function Audio(src) {\n      if (!(this instanceof Audio)) {\n        throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n      }\n      var node = unwrap(document.createElement(\"audio\"));\n      HTMLMediaElement.call(this, node);\n      rewrap(node, this);\n      node.setAttribute(\"preload\", \"auto\");\n      if (src !== undefined) node.setAttribute(\"src\", src);\n    }\n    Audio.prototype = HTMLAudioElement.prototype;\n    scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n    scope.wrappers.Audio = Audio;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLOptionElement = window.HTMLOptionElement;\n    function trimText(s) {\n      return s.replace(/\\s+/g, \" \").trim();\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    registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement(\"option\"));\n    function Option(text, value, defaultSelected, selected) {\n      if (!(this instanceof Option)) {\n        throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n      }\n      var node = unwrap(document.createElement(\"option\"));\n      HTMLElement.call(this, node);\n      rewrap(node, this);\n      if (text !== undefined) node.text = text;\n      if (value !== undefined) node.setAttribute(\"value\", value);\n      if (defaultSelected === true) node.setAttribute(\"selected\", \"\");\n      node.selected = selected === true;\n    }\n    Option.prototype = HTMLOptionElement.prototype;\n    scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n    scope.wrappers.Option = Option;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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 OriginalHTMLSelectElement = window.HTMLSelectElement;\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\") before = unwrap(before);\n        unwrap(this).add(unwrap(element), before);\n      },\n      remove: function(indexOrNode) {\n        if (indexOrNode === undefined) {\n          HTMLElement.prototype.remove.call(this);\n          return;\n        }\n        if (typeof indexOrNode === \"object\") indexOrNode = unwrap(indexOrNode);\n        unwrap(this).remove(indexOrNode);\n      },\n      get form() {\n        return wrap(unwrap(this).form);\n      }\n    });\n    registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement(\"select\"));\n    scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLTableElement = window.HTMLTableElement;\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      get tHead() {\n        return wrap(unwrap(this).tHead);\n      },\n      createTHead: function() {\n        return wrap(unwrap(this).createTHead());\n      },\n      createTFoot: function() {\n        return wrap(unwrap(this).createTFoot());\n      },\n      get tFoot() {\n        return wrap(unwrap(this).tFoot);\n      },\n      get tBodies() {\n        return wrapHTMLCollection(unwrap(this).tBodies);\n      },\n      createTBody: function() {\n        return wrap(unwrap(this).createTBody());\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    registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement(\"table\"));\n    scope.wrappers.HTMLTableElement = HTMLTableElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\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    registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement(\"thead\"));\n    scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\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      insertCell: function(index) {\n        return wrap(unwrap(this).insertCell(index));\n      }\n    });\n    registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement(\"tr\"));\n    scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n    function HTMLUnknownElement(node) {\n      switch (node.localName) {\n       case \"content\":\n        return new HTMLContentElement(node);\n\n       case \"shadow\":\n        return new HTMLShadowElement(node);\n\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  (function(scope) {\n    \"use strict\";\n    var Element = scope.wrappers.Element;\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var registerObject = scope.registerObject;\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    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    scope.wrappers.SVGElement = SVGElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var mixin = scope.mixin;\n    var registerWrapper = scope.registerWrapper;\n    var unwrap = scope.unwrap;\n    var wrap = scope.wrap;\n    var OriginalSVGUseElement = window.SVGUseElement;\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    function SVGUseElement(impl) {\n      parentInterface.call(this, impl);\n    }\n    SVGUseElement.prototype = Object.create(parentInterfacePrototype);\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    registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n    scope.wrappers.SVGUseElement = SVGUseElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalSVGElementInstance = window.SVGElementInstance;\n    if (!OriginalSVGElementInstance) return;\n    function SVGElementInstance(impl) {\n      EventTarget.call(this, impl);\n    }\n    SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n    mixin(SVGElementInstance.prototype, {\n      get correspondingElement() {\n        return wrap(unsafeUnwrap(this).correspondingElement);\n      },\n      get correspondingUseElement() {\n        return wrap(unsafeUnwrap(this).correspondingUseElement);\n      },\n      get parentNode() {\n        return wrap(unsafeUnwrap(this).parentNode);\n      },\n      get childNodes() {\n        throw new Error(\"Not implemented\");\n      },\n      get firstChild() {\n        return wrap(unsafeUnwrap(this).firstChild);\n      },\n      get lastChild() {\n        return wrap(unsafeUnwrap(this).lastChild);\n      },\n      get previousSibling() {\n        return wrap(unsafeUnwrap(this).previousSibling);\n      },\n      get nextSibling() {\n        return wrap(unsafeUnwrap(this).nextSibling);\n      }\n    });\n    registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n    scope.wrappers.SVGElementInstance = SVGElementInstance;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n    function CanvasRenderingContext2D(impl) {\n      setWrapper(impl, this);\n    }\n    mixin(CanvasRenderingContext2D.prototype, {\n      get canvas() {\n        return wrap(unsafeUnwrap(this).canvas);\n      },\n      drawImage: function() {\n        arguments[0] = unwrapIfNeeded(arguments[0]);\n        unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n      },\n      createPattern: function() {\n        arguments[0] = unwrap(arguments[0]);\n        return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n      }\n    });\n    registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement(\"canvas\").getContext(\"2d\"));\n    scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n    if (!OriginalWebGLRenderingContext) return;\n    function WebGLRenderingContext(impl) {\n      setWrapper(impl, this);\n    }\n    mixin(WebGLRenderingContext.prototype, {\n      get canvas() {\n        return wrap(unsafeUnwrap(this).canvas);\n      },\n      texImage2D: function() {\n        arguments[5] = unwrapIfNeeded(arguments[5]);\n        unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n      },\n      texSubImage2D: function() {\n        arguments[6] = unwrapIfNeeded(arguments[6]);\n        unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n      }\n    });\n    var instanceProperties = /WebKit/.test(navigator.userAgent) ? {\n      drawingBufferHeight: null,\n      drawingBufferWidth: null\n    } : {};\n    registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);\n    scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalRange = window.Range;\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    if (OriginalRange.prototype.createContextualFragment) {\n      Range.prototype.createContextualFragment = function(html) {\n        return wrap(unsafeUnwrap(this).createContextualFragment(html));\n      };\n    }\n    registerWrapper(window.Range, Range, document.createRange());\n    scope.wrappers.Range = Range;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var DocumentFragment = registerObject(document.createDocumentFragment());\n    mixin(DocumentFragment.prototype, ParentNodeInterface);\n    mixin(DocumentFragment.prototype, SelectorsInterface);\n    mixin(DocumentFragment.prototype, GetElementsByInterface);\n    var Comment = registerObject(document.createComment(\"\"));\n    scope.wrappers.Comment = Comment;\n    scope.wrappers.DocumentFragment = DocumentFragment;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var shadowHostTable = new WeakMap();\n    var nextOlderShadowTreeTable = new WeakMap();\n    var spaceCharRe = /[ \\t\\n\\r\\f]/;\n    function ShadowRoot(hostWrapper) {\n      var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n      DocumentFragment.call(this, node);\n      rewrap(node, this);\n      var oldShadowRoot = hostWrapper.shadowRoot;\n      nextOlderShadowTreeTable.set(this, oldShadowRoot);\n      this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n      shadowHostTable.set(this, hostWrapper);\n    }\n    ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n    mixin(ShadowRoot.prototype, {\n      constructor: ShadowRoot,\n      get innerHTML() {\n        return getInnerHTML(this);\n      },\n      set innerHTML(value) {\n        setInnerHTML(this, value);\n        this.invalidateShadowRenderer();\n      },\n      get olderShadowRoot() {\n        return nextOlderShadowTreeTable.get(this) || null;\n      },\n      get host() {\n        return shadowHostTable.get(this) || null;\n      },\n      invalidateShadowRenderer: function() {\n        return shadowHostTable.get(this).invalidateShadowRenderer();\n      },\n      elementFromPoint: function(x, y) {\n        return elementFromPoint(this, this.ownerDocument, x, y);\n      },\n      getElementById: function(id) {\n        if (spaceCharRe.test(id)) return null;\n        return this.querySelector('[id=\"' + id + '\"]');\n      }\n    });\n    scope.wrappers.ShadowRoot = ShadowRoot;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var ArraySplice = scope.ArraySplice;\n    function updateWrapperUpAndSideways(wrapper) {\n      wrapper.previousSibling_ = wrapper.previousSibling;\n      wrapper.nextSibling_ = wrapper.nextSibling;\n      wrapper.parentNode_ = wrapper.parentNode;\n    }\n    function updateWrapperDown(wrapper) {\n      wrapper.firstChild_ = wrapper.firstChild;\n      wrapper.lastChild_ = wrapper.lastChild;\n    }\n    function updateAllChildNodes(parentNodeWrapper) {\n      assert(parentNodeWrapper instanceof Node);\n      for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {\n        updateWrapperUpAndSideways(childWrapper);\n      }\n      updateWrapperDown(parentNodeWrapper);\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      remove(newChildWrapper);\n      updateWrapperUpAndSideways(newChildWrapper);\n      if (!refChildWrapper) {\n        parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n        if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n        var lastChildWrapper = wrap(parentNode.lastChild);\n        if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n      } else {\n        if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;\n        refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n      }\n      scope.originalInsertBefore.call(parentNode, newChild, refChild);\n    }\n    function remove(nodeWrapper) {\n      var node = unwrap(nodeWrapper);\n      var parentNode = node.parentNode;\n      if (!parentNode) return;\n      var parentNodeWrapper = wrap(parentNode);\n      updateWrapperUpAndSideways(nodeWrapper);\n      if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n      if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n      if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;\n      if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;\n      scope.originalRemoveChild.call(parentNode, node);\n    }\n    var distributedNodesTable = new WeakMap();\n    var destinationInsertionPointsTable = new WeakMap();\n    var rendererForHostTable = new WeakMap();\n    function resetDistributedNodes(insertionPoint) {\n      distributedNodesTable.set(insertionPoint, []);\n    }\n    function getDistributedNodes(insertionPoint) {\n      var rv = distributedNodesTable.get(insertionPoint);\n      if (!rv) distributedNodesTable.set(insertionPoint, rv = []);\n      return rv;\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    var request = oneOf(window, [ \"requestAnimationFrame\", \"mozRequestAnimationFrame\", \"webkitRequestAnimationFrame\", \"setTimeout\" ]);\n    var pendingDirtyRenderers = [];\n    var renderTimer;\n    function renderAllPending() {\n      for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n        var renderer = pendingDirtyRenderers[i];\n        var parentRenderer = renderer.parentRenderer;\n        if (parentRenderer && parentRenderer.dirty) continue;\n        renderer.render();\n      }\n      pendingDirtyRenderers = [];\n    }\n    function handleRequestAnimationFrame() {\n      renderTimer = null;\n      renderAllPending();\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    function getShadowRootAncestor(node) {\n      var root = getTreeScope(node).root;\n      if (root instanceof ShadowRoot) return root;\n      return null;\n    }\n    function getRendererForShadowRoot(shadowRoot) {\n      return getRendererForHost(shadowRoot.host);\n    }\n    var spliceDiff = new ArraySplice();\n    spliceDiff.equals = function(renderNode, rawNode) {\n      return unwrap(renderNode.node) === rawNode;\n    };\n    function RenderNode(node) {\n      this.skip = false;\n      this.node = node;\n      this.childNodes = [];\n    }\n    RenderNode.prototype = {\n      append: function(node) {\n        var rv = new RenderNode(node);\n        this.childNodes.push(rv);\n        return rv;\n      },\n      sync: function(opt_added) {\n        if (this.skip) return;\n        var nodeWrapper = this.node;\n        var newChildren = this.childNodes;\n        var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n        var added = opt_added || new WeakMap();\n        var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\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          var removedCount = splice.removed.length;\n          for (var j = 0; j < removedCount; j++) {\n            var wrapper = wrap(oldChildren[oldIndex++]);\n            if (!added.get(wrapper)) remove(wrapper);\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            added.set(newChildWrapper, true);\n            newChildRenderNode.sync(added);\n          }\n          lastIndex += addedCount;\n        }\n        for (var i = lastIndex; i < newChildren.length; i++) {\n          newChildren[i].sync(added);\n        }\n      }\n    };\n    function ShadowRenderer(host) {\n      this.host = host;\n      this.dirty = false;\n      this.invalidateAttributes();\n      this.associateNode(host);\n    }\n    ShadowRenderer.prototype = {\n      render: function(opt_renderNode) {\n        if (!this.dirty) return;\n        this.invalidateAttributes();\n        var host = this.host;\n        this.distribution(host);\n        var renderNode = opt_renderNode || new RenderNode(host);\n        this.buildRenderTree(renderNode, host);\n        var topMostRenderer = !opt_renderNode;\n        if (topMostRenderer) renderNode.sync();\n        this.dirty = false;\n      },\n      get parentRenderer() {\n        return getTreeScope(this.host).renderer;\n      },\n      invalidate: function() {\n        if (!this.dirty) {\n          this.dirty = true;\n          var parentRenderer = this.parentRenderer;\n          if (parentRenderer) parentRenderer.invalidate();\n          pendingDirtyRenderers.push(this);\n          if (renderTimer) return;\n          renderTimer = window[request](handleRequestAnimationFrame, 0);\n        }\n      },\n      distribution: function(root) {\n        this.resetAllSubtrees(root);\n        this.distributionResolution(root);\n      },\n      resetAll: function(node) {\n        if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);\n        this.resetAllSubtrees(node);\n      },\n      resetAllSubtrees: function(node) {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.resetAll(child);\n        }\n        if (node.shadowRoot) this.resetAll(node.shadowRoot);\n        if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);\n      },\n      distributionResolution: function(node) {\n        if (isShadowHost(node)) {\n          var shadowHost = node;\n          var pool = poolPopulation(shadowHost);\n          var shadowTrees = getShadowTrees(shadowHost);\n          for (var i = 0; i < shadowTrees.length; i++) {\n            this.poolDistribution(shadowTrees[i], pool);\n          }\n          for (var i = shadowTrees.length - 1; i >= 0; i--) {\n            var shadowTree = shadowTrees[i];\n            var shadow = getShadowInsertionPoint(shadowTree);\n            if (shadow) {\n              var olderShadowRoot = shadowTree.olderShadowRoot;\n              if (olderShadowRoot) {\n                pool = poolPopulation(olderShadowRoot);\n              }\n              for (var j = 0; j < pool.length; j++) {\n                destributeNodeInto(pool[j], shadow);\n              }\n            }\n            this.distributionResolution(shadowTree);\n          }\n        }\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.distributionResolution(child);\n        }\n      },\n      poolDistribution: function(node, pool) {\n        if (node instanceof HTMLShadowElement) return;\n        if (node instanceof HTMLContentElement) {\n          var content = node;\n          this.updateDependentAttributes(content.getAttribute(\"select\"));\n          var anyDistributed = false;\n          for (var i = 0; i < pool.length; i++) {\n            var node = pool[i];\n            if (!node) continue;\n            if (matches(node, content)) {\n              destributeNodeInto(node, content);\n              pool[i] = undefined;\n              anyDistributed = true;\n            }\n          }\n          if (!anyDistributed) {\n            for (var child = content.firstChild; child; child = child.nextSibling) {\n              destributeNodeInto(child, content);\n            }\n          }\n          return;\n        }\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.poolDistribution(child, pool);\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        if (isShadowHost(node)) {\n          var renderer = getRendererForHost(node);\n          renderer.dirty = false;\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)) children.push(distributedNode);\n            }\n          } else {\n            children.push(child);\n          }\n        }\n        return children;\n      },\n      invalidateAttributes: function() {\n        this.attributes = Object.create(null);\n      },\n      updateDependentAttributes: function(selector) {\n        if (!selector) return;\n        var attributes = this.attributes;\n        if (/\\.\\w+/.test(selector)) attributes[\"class\"] = true;\n        if (/#\\w+/.test(selector)) attributes[\"id\"] = true;\n        selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n          attributes[name] = true;\n        });\n      },\n      dependsOnAttribute: function(name) {\n        return this.attributes[name];\n      },\n      associateNode: function(node) {\n        unsafeUnwrap(node).polymerShadowRenderer_ = this;\n      }\n    };\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    function getShadowInsertionPoint(node) {\n      if (node instanceof HTMLShadowElement) return node;\n      if (node instanceof HTMLContentElement) return null;\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        var res = getShadowInsertionPoint(child);\n        if (res) return res;\n      }\n      return null;\n    }\n    function destributeNodeInto(child, insertionPoint) {\n      getDistributedNodes(insertionPoint).push(child);\n      var points = destinationInsertionPointsTable.get(child);\n      if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);\n    }\n    function getDestinationInsertionPoints(node) {\n      return destinationInsertionPointsTable.get(node);\n    }\n    function resetDestinationInsertionPoints(node) {\n      destinationInsertionPointsTable.set(node, undefined);\n    }\n    var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n    function matches(node, contentElement) {\n      var select = contentElement.getAttribute(\"select\");\n      if (!select) return true;\n      select = select.trim();\n      if (!select) return true;\n      if (!(node instanceof Element)) return false;\n      if (!selectorStartCharRe.test(select)) return false;\n      try {\n        return node.matches(select);\n      } catch (ex) {\n        return false;\n      }\n    }\n    function isFinalDestination(insertionPoint, node) {\n      var points = getDestinationInsertionPoints(node);\n      return points && points[points.length - 1] === insertionPoint;\n    }\n    function isInsertionPoint(node) {\n      return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;\n    }\n    function isShadowHost(shadowHost) {\n      return shadowHost.shadowRoot;\n    }\n    function getShadowTrees(host) {\n      var trees = [];\n      for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n        trees.push(tree);\n      }\n      return trees;\n    }\n    function render(host) {\n      new ShadowRenderer(host).render();\n    }\n    Node.prototype.invalidateShadowRenderer = function(force) {\n      var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n      if (renderer) {\n        renderer.invalidate();\n        return true;\n      }\n      return false;\n    };\n    HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {\n      renderAllPending();\n      return getDistributedNodes(this);\n    };\n    Element.prototype.getDestinationInsertionPoints = function() {\n      renderAllPending();\n      return getDestinationInsertionPoints(this) || [];\n    };\n    HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n      this.invalidateShadowRenderer();\n      var shadowRoot = getShadowRootAncestor(this);\n      var renderer;\n      if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);\n      unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n      if (renderer) renderer.invalidate();\n    };\n    scope.getRendererForHost = getRendererForHost;\n    scope.getShadowTrees = getShadowTrees;\n    scope.renderAllPending = renderAllPending;\n    scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n    scope.visual = {\n      insertBefore: insertBefore,\n      remove: remove\n    };\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var elementsWithFormProperty = [ \"HTMLButtonElement\", \"HTMLFieldSetElement\", \"HTMLInputElement\", \"HTMLKeygenElement\", \"HTMLLabelElement\", \"HTMLLegendElement\", \"HTMLObjectElement\", \"HTMLOutputElement\", \"HTMLTextAreaElement\" ];\n    function createWrapperConstructor(name) {\n      if (!window[name]) return;\n      assert(!scope.wrappers[name]);\n      var GeneratedWrapper = function(node) {\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      registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));\n      scope.wrappers[name] = GeneratedWrapper;\n    }\n    elementsWithFormProperty.forEach(createWrapperConstructor);\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalSelection = window.Selection;\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    registerWrapper(window.Selection, Selection, window.getSelection());\n    scope.wrappers.Selection = Selection;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var implementationTable = new WeakMap();\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    defineWrapGetter(Document, \"documentElement\");\n    defineWrapGetter(Document, \"body\");\n    defineWrapGetter(Document, \"head\");\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    [ \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"getElementById\" ].forEach(wrapMethod);\n    var originalAdoptNode = document.adoptNode;\n    function adoptNodeNoRemove(node, doc) {\n      originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n      adoptSubtree(node, doc);\n    }\n    function adoptSubtree(node, doc) {\n      if (node.shadowRoot) doc.adoptNode(node.shadowRoot);\n      if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        adoptSubtree(child, doc);\n      }\n    }\n    function adoptOlderShadowRoots(shadowRoot, doc) {\n      var oldShadowRoot = shadowRoot.olderShadowRoot;\n      if (oldShadowRoot) doc.adoptNode(oldShadowRoot);\n    }\n    var originalGetSelection = document.getSelection;\n    mixin(Document.prototype, {\n      adoptNode: function(node) {\n        if (node.parentNode) 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, \"[name=\" + JSON.stringify(String(name)) + \"]\");\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        if (!prototype) prototype = Object.create(HTMLElement.prototype);\n        if (scope.nativePrototypeTable.get(prototype)) {\n          throw new Error(\"NotSupportedError\");\n        }\n        var proto = Object.getPrototypeOf(prototype);\n        var nativePrototype;\n        var prototypes = [];\n        while (proto) {\n          nativePrototype = scope.nativePrototypeTable.get(proto);\n          if (nativePrototype) break;\n          prototypes.push(proto);\n          proto = Object.getPrototypeOf(proto);\n        }\n        if (!nativePrototype) {\n          throw new Error(\"NotSupportedError\");\n        }\n        var newPrototype = Object.create(nativePrototype);\n        for (var i = prototypes.length - 1; i >= 0; i--) {\n          newPrototype = Object.create(newPrototype);\n        }\n        [ \"createdCallback\", \"attachedCallback\", \"detachedCallback\", \"attributeChangedCallback\" ].forEach(function(name) {\n          var f = prototype[name];\n          if (!f) return;\n          newPrototype[name] = function() {\n            if (!(wrap(this) instanceof CustomElementConstructor)) {\n              rewrap(this);\n            }\n            f.apply(wrap(this), arguments);\n          };\n        });\n        var p = {\n          prototype: newPrototype\n        };\n        if (extendsOption) p.extends = extendsOption;\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        scope.constructorTable.set(newPrototype, CustomElementConstructor);\n        scope.nativePrototypeTable.set(prototype, newPrototype);\n        var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);\n        return CustomElementConstructor;\n      };\n      forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"registerElement\" ]);\n    }\n    forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ \"appendChild\", \"compareDocumentPosition\", \"contains\", \"getElementsByClassName\", \"getElementsByTagName\", \"getElementsByTagNameNS\", \"insertBefore\", \"querySelector\", \"querySelectorAll\", \"removeChild\", \"replaceChild\" ].concat(matchesNames));\n    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"adoptNode\", \"importNode\", \"contains\", \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"elementFromPoint\", \"getElementById\", \"getElementsByName\", \"getSelection\" ]);\n    mixin(Document.prototype, GetElementsByInterface);\n    mixin(Document.prototype, ParentNodeInterface);\n    mixin(Document.prototype, SelectorsInterface);\n    mixin(Document.prototype, {\n      get implementation() {\n        var implementation = implementationTable.get(this);\n        if (implementation) return implementation;\n        implementation = new DOMImplementation(unwrap(this).implementation);\n        implementationTable.set(this, implementation);\n        return implementation;\n      },\n      get defaultView() {\n        return wrap(unwrap(this).defaultView);\n      }\n    });\n    registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(\"\"));\n    if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);\n    wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);\n    function DOMImplementation(impl) {\n      setWrapper(impl, this);\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    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    wrapImplMethod(DOMImplementation, \"createDocumentType\");\n    wrapImplMethod(DOMImplementation, \"createDocument\");\n    wrapImplMethod(DOMImplementation, \"createHTMLDocument\");\n    forwardImplMethod(DOMImplementation, \"hasFeature\");\n    registerWrapper(window.DOMImplementation, DOMImplementation);\n    forwardMethodsToWrapper([ window.DOMImplementation ], [ \"createDocumentType\", \"createDocument\", \"createHTMLDocument\", \"hasFeature\" ]);\n    scope.adoptNodeNoRemove = adoptNodeNoRemove;\n    scope.wrappers.DOMImplementation = DOMImplementation;\n    scope.wrappers.Document = Document;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalWindow = window.Window;\n    var originalGetComputedStyle = window.getComputedStyle;\n    var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n    var originalGetSelection = window.getSelection;\n    function Window(impl) {\n      EventTarget.call(this, impl);\n    }\n    Window.prototype = Object.create(EventTarget.prototype);\n    OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n    };\n    if (originalGetDefaultComputedStyle) {\n      OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n        return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);\n      };\n    }\n    OriginalWindow.prototype.getSelection = function() {\n      return wrap(this || window).getSelection();\n    };\n    delete window.getComputedStyle;\n    delete window.getDefaultComputedStyle;\n    delete window.getSelection;\n    [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ].forEach(function(name) {\n      OriginalWindow.prototype[name] = function() {\n        var w = wrap(this || window);\n        return w[name].apply(w, arguments);\n      };\n      delete window[name];\n    });\n    mixin(Window.prototype, {\n      getComputedStyle: function(el, pseudo) {\n        renderAllPending();\n        return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n      },\n      getSelection: function() {\n        renderAllPending();\n        return new Selection(originalGetSelection.call(unwrap(this)));\n      },\n      get document() {\n        return wrap(unwrap(this).document);\n      }\n    });\n    if (originalGetDefaultComputedStyle) {\n      Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n        renderAllPending();\n        return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n      };\n    }\n    registerWrapper(OriginalWindow, Window, window);\n    scope.wrappers.Window = Window;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var unwrap = scope.unwrap;\n    var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n    var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;\n    if (OriginalDataTransferSetDragImage) {\n      OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n        OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n      };\n    }\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var registerWrapper = scope.registerWrapper;\n    var setWrapper = scope.setWrapper;\n    var unwrap = scope.unwrap;\n    var OriginalFormData = window.FormData;\n    if (!OriginalFormData) return;\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    registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n    scope.wrappers.FormData = FormData;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var unwrapIfNeeded = scope.unwrapIfNeeded;\n    var originalSend = XMLHttpRequest.prototype.send;\n    XMLHttpRequest.prototype.send = function(obj) {\n      return originalSend.call(this, unwrapIfNeeded(obj));\n    };\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var isWrapperFor = scope.isWrapperFor;\n    var elements = {\n      a: \"HTMLAnchorElement\",\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      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      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    function overrideConstructor(tagName) {\n      var nativeConstructorName = elements[tagName];\n      var nativeConstructor = window[nativeConstructorName];\n      if (!nativeConstructor) return;\n      var element = document.createElement(tagName);\n      var wrapperConstructor = element.constructor;\n      window[nativeConstructorName] = wrapperConstructor;\n    }\n    Object.keys(elements).forEach(overrideConstructor);\n    Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n      window[name] = scope.wrappers[name];\n    });\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    var ShadowCSS = {\n      strictStyling: false,\n      registry: {},\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        var cssText = stylesToCssText(scopeStyles, true);\n        cssText = this.scopeCssText(cssText, scopeSelector);\n        if (root) {\n          root.shimmedStyle = cssText;\n        }\n        this.addCssToDocument(cssText, name);\n      },\n      shimStyle: function(style, selector) {\n        return this.shimCssText(style.textContent, selector);\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        this.removeStyles(root, def.rootStyles);\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          Array.prototype.forEach.call(root.querySelectorAll(\"*\"), function(node) {\n            node.setAttribute(name, \"\");\n          });\n          Array.prototype.forEach.call(root.querySelectorAll(\"template\"), function(template) {\n            this.applyScopeToContent(template.content, name);\n          }, this);\n        }\n      },\n      insertDirectives: function(cssText) {\n        cssText = this.insertPolyfillDirectivesInCssText(cssText);\n        return this.insertPolyfillRulesInCssText(cssText);\n      },\n      insertPolyfillDirectivesInCssText: function(cssText) {\n        cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n          return p1.slice(0, -2) + \"{\";\n        });\n        return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n          return p1 + \" {\";\n        });\n      },\n      insertPolyfillRulesInCssText: function(cssText) {\n        cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\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      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        cssText = cssText + \"\\n\" + unscoped;\n        return cssText.trim();\n      },\n      extractUnscopedRulesFromCssText: function(cssText) {\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      convertColonHost: function(cssText) {\n        return this.convertColonRule(cssText, cssColonHostRe, this.colonHostPartReplacer);\n      },\n      convertColonHostContext: function(cssText) {\n        return this.convertColonRule(cssText, cssColonHostContextRe, this.colonHostContextPartReplacer);\n      },\n      convertColonRule: function(cssText, regExp, partReplacer) {\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      convertShadowDOMSelectors: function(cssText) {\n        for (var i = 0; i < shadowDOMSelectorsRe.length; i++) {\n          cssText = cssText.replace(shadowDOMSelectorsRe[i], \" \");\n        }\n        return cssText;\n      },\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, 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              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) ? this.applyStrictSelectorScope(p, scopeSelector) : 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) ? this.applySelectorScopeList(selector, selectorScope) : this.applySimpleSelectorScope(selector, selectorScope);\n      },\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      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      applyStrictSelectorScope: function(selector, scopeSelector) {\n        scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, \"$1\");\n        var splits = [ \" \", \">\", \"+\", \"~\" ], scoped = selector, attrName = \"[\" + scopeSelector + \"]\";\n        splits.forEach(function(sep) {\n          var parts = scoped.split(sep);\n          scoped = parts.map(function(p) {\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(colonHostRe, polyfillHost);\n      },\n      propertiesFromRule: function(rule) {\n        var cssText = rule.style.cssText;\n        if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n          cssText = cssText.replace(/content:[^;]*;/g, \"content: '\" + rule.style.content + \"';\");\n        }\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    var selectorRe = /([^{]*)({[\\s\\S]*?})/gim, cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim, cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim, cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim, cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim, cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim, cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim, cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim, cssPseudoRe = /::(x-[^\\s{,(]*)/gim, cssPartRe = /::part\\(([^)]*)\\)/gim, polyfillHost = \"-shadowcsshost\", polyfillHostContext = \"-shadowcsscontext\", parenSuffix = \")(?:\\\\((\" + \"(?:\\\\([^)(]*\\\\)|[^)(]*)+?\" + \")\\\\))?([^,{]*)\";\n    var cssColonHostRe = new RegExp(\"(\" + polyfillHost + parenSuffix, \"gim\"), cssColonHostContextRe = new RegExp(\"(\" + polyfillHostContext + parenSuffix, \"gim\"), selectorReSuffix = \"([>\\\\s~+[.,{:][\\\\s\\\\S]*)?$\", colonHostRe = /\\:host/gim, colonHostContextRe = /\\:host-context/gim, polyfillHostNoCombinator = polyfillHost + \"-no-combinator\", polyfillHostRe = new RegExp(polyfillHost, \"gim\"), polyfillHostContextRe = new RegExp(polyfillHostContext, \"gim\"), shadowDOMSelectorsRe = [ /\\^\\^/g, /\\^/g, /\\/shadow\\//g, /\\/shadow-deep\\//g, /::shadow/g, /\\/deep\\//g, /::content/g ];\n    function stylesToCssText(styles, preserveComments) {\n      var cssText = \"\";\n      Array.prototype.forEach.call(styles, function(s) {\n        cssText += s.textContent + \"\\n\\n\";\n      });\n      if (!preserveComments) {\n        cssText = cssText.replace(cssCommentRe, \"\");\n      }\n      return cssText;\n    }\n    function cssTextToStyle(cssText) {\n      var style = document.createElement(\"style\");\n      style.textContent = cssText;\n      return style;\n    }\n    function cssToRules(cssText) {\n      var style = cssTextToStyle(cssText);\n      document.head.appendChild(style);\n      var rules = [];\n      if (style.sheet) {\n        try {\n          rules = style.sheet.cssRules;\n        } catch (e) {}\n      } else {\n        console.warn(\"sheet not found\", style);\n      }\n      style.parentNode.removeChild(style);\n      return rules;\n    }\n    var frame = document.createElement(\"iframe\");\n    frame.style.display = \"none\";\n    function 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    function 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    var isChrome = navigator.userAgent.match(\"Chrome\");\n    function 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    function 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    function addCssToDocument(cssText) {\n      if (cssText) {\n        getSheet().appendChild(document.createTextNode(cssText));\n      }\n    }\n    function addOwnSheet(cssText, name) {\n      var style = cssTextToStyle(cssText);\n      style.setAttribute(name, \"\");\n      style.setAttribute(SHIMMED_ATTRIBUTE, \"\");\n      document.head.appendChild(style);\n    }\n    var SHIM_ATTRIBUTE = \"shim-shadowdom\";\n    var SHIMMED_ATTRIBUTE = \"shim-shadowdom-css\";\n    var NO_SHIM_ATTRIBUTE = \"no-shim\";\n    var sheet;\n    function 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    if (window.ShadowDOMPolyfill) {\n      addCssToDocument(\"style { display: none !important; }\\n\");\n      var doc = ShadowDOMPolyfill.wrap(document);\n      var head = doc.querySelector(\"head\");\n      head.insertBefore(getSheet(), head.childNodes[0]);\n      document.addEventListener(\"DOMContentLoaded\", function() {\n        var urlResolver = scope.urlResolver;\n        if (window.HTMLImports && !HTMLImports.useNative) {\n          var SHIM_SHEET_SELECTOR = \"link[rel=stylesheet]\" + \"[\" + 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          HTMLImports.parser.documentSelectors = [ HTMLImports.parser.documentSelectors, SHIM_SHEET_SELECTOR, SHIM_STYLE_SELECTOR ].join(\",\");\n          var originalParseGeneric = HTMLImports.parser.parseGeneric;\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            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            if (style.parentNode !== 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          var hasResource = HTMLImports.parser.hasResource;\n          HTMLImports.parser.hasResource = function(node) {\n            if (node.localName === \"link\" && node.rel === \"stylesheet\" && node.hasAttribute(SHIM_ATTRIBUTE)) {\n              return node.__resource;\n            } else {\n              return hasResource.call(this, node);\n            }\n          };\n        }\n      });\n    }\n    scope.ShadowCSS = ShadowCSS;\n  })(window.WebComponents);\n}\n\n(function(scope) {\n  if (window.ShadowDOMPolyfill) {\n    window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n    window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n  } else {\n    window.wrap = window.unwrap = function(n) {\n      return n;\n    };\n  }\n})(window.WebComponents);\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.HTMLImports = window.HTMLImports || {\n  flags: {}\n};\n\n(function(scope) {\n  var IMPORT_LINK_TYPE = \"import\";\n  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement(\"link\"));\n  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\n  var wrap = function(node) {\n    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n  };\n  var rootDocument = wrap(document);\n  var currentScriptDescriptor = {\n    get: function() {\n      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== \"complete\" ? document.scripts[document.scripts.length - 1] : null);\n      return wrap(script);\n    },\n    configurable: true\n  };\n  Object.defineProperty(document, \"_currentScript\", currentScriptDescriptor);\n  Object.defineProperty(rootDocument, \"_currentScript\", currentScriptDescriptor);\n  var isIE = /Trident|Edge/.test(navigator.userAgent);\n  function whenReady(callback, doc) {\n    doc = doc || rootDocument;\n    whenDocumentReady(function() {\n      watchImportsLoad(callback, doc);\n    }, doc);\n  }\n  var requiredReadyState = isIE ? \"complete\" : \"interactive\";\n  var READY_EVENT = \"readystatechange\";\n  function isDocumentReady(doc) {\n    return doc.readyState === \"complete\" || doc.readyState === requiredReadyState;\n  }\n  function whenDocumentReady(callback, doc) {\n    if (!isDocumentReady(doc)) {\n      var checkReady = function() {\n        if (doc.readyState === \"complete\" || 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  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n  function 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 && callback) {\n        callback();\n      }\n    }\n    function loadedImport(e) {\n      markTargetLoaded(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            target: imp\n          });\n        } else {\n          imp.addEventListener(\"load\", loadedImport);\n          imp.addEventListener(\"error\", loadedImport);\n        }\n      }\n    } else {\n      checkDone();\n    }\n  }\n  function isImportLoaded(link) {\n    return useNative ? link.__loaded || link.import && link.import.readyState !== \"loading\" : link.__importParsed;\n  }\n  if (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, {\n      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    function isImport(element) {\n      return element.localName === \"link\" && element.rel === \"import\";\n    }\n    function handleImport(element) {\n      var loaded = element.import;\n      if (loaded) {\n        markTargetLoaded({\n          target: element\n        });\n      } else {\n        element.addEventListener(\"load\", markTargetLoaded);\n        element.addEventListener(\"error\", markTargetLoaded);\n      }\n    }\n    (function() {\n      if (document.readyState === \"loading\") {\n        var imports = document.querySelectorAll(\"link[rel=import]\");\n        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {\n          handleImport(imp);\n        }\n      }\n    })();\n  }\n  whenReady(function() {\n    HTMLImports.ready = true;\n    HTMLImports.readyTime = new Date().getTime();\n    rootDocument.dispatchEvent(new CustomEvent(\"HTMLImportsLoaded\", {\n      bubbles: true\n    }));\n  });\n  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n  scope.useNative = useNative;\n  scope.rootDocument = rootDocument;\n  scope.whenReady = whenReady;\n  scope.isIE = isIE;\n})(HTMLImports);\n\n(function(scope) {\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n})(HTMLImports);\n\nHTMLImports.addModule(function(scope) {\n  var CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n  var CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n  var 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  scope.path = path;\n});\n\nHTMLImports.addModule(function(scope) {\n  xhr = {\n    async: true,\n    ok: function(request) {\n      return request.status >= 200 && request.status < 300 || request.status === 304 || 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          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = locationHeader.substr(0, 1) === \"/\" ? location.origin + locationHeader : locationHeader;\n          }\n          next.call(nextContext, !xhr.ok(request) && request, 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  scope.xhr = xhr;\n});\n\nHTMLImports.addModule(function(scope) {\n  var xhr = scope.xhr;\n  var flags = scope.flags;\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  Loader.prototype = {\n    addNodes: function(nodes) {\n      this.inflight += nodes.length;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        this.require(n);\n      }\n      this.checkDone();\n    },\n    addNode: function(node) {\n      this.inflight++;\n      this.require(node);\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      elt.__nodeUrl = url;\n      if (!this.dedupe(url, elt)) {\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        this.pending[url].push(elt);\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        this.tail();\n        return true;\n      }\n      this.pending[url] = [ elt ];\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log(\"fetch\", url, elt);\n      if (url.match(/^data:/)) {\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      }\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        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  scope.Loader = Loader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var Observer = function(addCallback) {\n    this.addCallback = addCallback;\n    this.mo = new MutationObserver(this.handler.bind(this));\n  };\n  Observer.prototype = {\n    handler: function(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          this.addedNodes(m.addedNodes);\n        }\n      }\n    },\n    addedNodes: function(nodes) {\n      if (this.addCallback) {\n        this.addCallback(nodes);\n      }\n      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {\n        if (n.children && n.children.length) {\n          this.addedNodes(n.children);\n        }\n      }\n    },\n    observe: function(root) {\n      this.mo.observe(root, {\n        childList: true,\n        subtree: true\n      });\n    }\n  };\n  scope.Observer = Observer;\n});\n\nHTMLImports.addModule(function(scope) {\n  var path = scope.path;\n  var rootDocument = scope.rootDocument;\n  var flags = scope.flags;\n  var isIE = scope.isIE;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = \"link[rel=\" + IMPORT_LINK_TYPE + \"]\";\n  var importParser = {\n    documentSelectors: IMPORT_SELECTOR,\n    importsSelectors: [ IMPORT_SELECTOR, \"link[rel=stylesheet]\", \"style\", \"script:not([type])\", 'script[type=\"text/javascript\"]' ].join(\",\"),\n    map: {\n      link: \"parseLink\",\n      script: \"parseScript\",\n      style: \"parseStyle\"\n    },\n    dynamicElements: [],\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    parseDynamic: function(elt, quiet) {\n      this.dynamicElements.push(elt);\n      if (!quiet) {\n        this.parseNext();\n      }\n    },\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      this.markDynamicParsingComplete(elt);\n      if (elt.__importElement) {\n        elt.__importElement.__importParsed = true;\n        this.markDynamicParsingComplete(elt.__importElement);\n      }\n      this.parsingElement = null;\n      flags.parse && console.log(\"completed\", elt);\n    },\n    markDynamicParsingComplete: function(elt) {\n      var i = this.dynamicElements.indexOf(elt);\n      if (i >= 0) {\n        this.dynamicElements.splice(i, 1);\n      }\n    },\n    parseImport: function(elt) {\n      if (HTMLImports.__importsParsingHook) {\n        HTMLImports.__importsParsingHook(elt);\n      }\n      if (elt.import) {\n        elt.import.__importParsed = true;\n      }\n      this.markParsingComplete(elt);\n      if (elt.__resource && !elt.__error) {\n        elt.dispatchEvent(new CustomEvent(\"load\", {\n          bubbles: false\n        }));\n      } else {\n        elt.dispatchEvent(new CustomEvent(\"error\", {\n          bubbles: false\n        }));\n      }\n      if (elt.__pending) {\n        var fn;\n        while (elt.__pending.length) {\n          fn = elt.__pending.shift();\n          if (fn) {\n            fn({\n              target: elt\n            });\n          }\n        }\n      }\n      this.parseNext();\n    },\n    parseLink: function(linkElt) {\n      if (nodeIsImport(linkElt)) {\n        this.parseImport(linkElt);\n      } else {\n        linkElt.href = linkElt.href;\n        this.parseGeneric(linkElt);\n      }\n    },\n    parseStyle: function(elt) {\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      port.parentNode.insertBefore(elt, port);\n    },\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      if (isIE && elt.localName === \"style\") {\n        var fakeLoad = false;\n        if (elt.textContent.indexOf(\"@import\") == -1) {\n          fakeLoad = true;\n        } else if (elt.sheet) {\n          fakeLoad = true;\n          var csr = elt.sheet.cssRules;\n          var len = csr ? csr.length : 0;\n          for (var i = 0, r; i < len && (r = csr[i]); i++) {\n            if (r.type === CSSRule.IMPORT_RULE) {\n              fakeLoad = fakeLoad && Boolean(r.styleSheet);\n            }\n          }\n        }\n        if (fakeLoad) {\n          elt.dispatchEvent(new CustomEvent(\"load\", {\n            bubbles: false\n          }));\n        }\n      }\n    },\n    parseScript: function(scriptElt) {\n      var script = document.createElement(\"script\");\n      script.__importElement = scriptElt;\n      script.src = scriptElt.src ? scriptElt.src : 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    nextToParse: function() {\n      this._mayParse = [];\n      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());\n    },\n    nextToParseInDoc: function(doc, link) {\n      if (doc && this._mayParse.indexOf(doc) < 0) {\n        this._mayParse.push(doc);\n        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {\n          if (!this.isParsed(n)) {\n            if (this.hasResource(n)) {\n              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n            } else {\n              return;\n            }\n          }\n        }\n      }\n      return link;\n    },\n    nextToParseDynamic: function() {\n      return this.dynamicElements[0];\n    },\n    parseSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;\n    },\n    isParsed: function(node) {\n      return node.__importParsed;\n    },\n    needsDynamicParsing: function(elt) {\n      return this.dynamicElements.indexOf(elt) >= 0;\n    },\n    hasResource: function(node) {\n      if (nodeIsImport(node) && node.import === undefined) {\n        return false;\n      }\n      return true;\n    }\n  };\n  function nodeIsImport(elt) {\n    return elt.localName === \"link\" && elt.rel === IMPORT_LINK_TYPE;\n  }\n  function generateScriptDataUrl(script) {\n    var scriptContent = generateScriptContent(script);\n    return \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(scriptContent);\n  }\n  function generateScriptContent(script) {\n    return script.textContent + generateSourceMapHint(script);\n  }\n  function generateSourceMapHint(script) {\n    var owner = script.ownerDocument;\n    owner.__importedScripts = owner.__importedScripts || 0;\n    var moniker = script.ownerDocument.baseURI;\n    var num = owner.__importedScripts ? \"-\" + owner.__importedScripts : \"\";\n    owner.__importedScripts++;\n    return \"\\n//# sourceURL=\" + moniker + num + \".js\\n\";\n  }\n  function cloneStyle(style) {\n    var clone = style.ownerDocument.createElement(\"style\");\n    clone.textContent = style.textContent;\n    path.resolveUrlsInStyle(clone);\n    return clone;\n  }\n  scope.parser = importParser;\n  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;\n});\n\nHTMLImports.addModule(function(scope) {\n  var flags = scope.flags;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;\n  var rootDocument = scope.rootDocument;\n  var Loader = scope.Loader;\n  var Observer = scope.Observer;\n  var parser = scope.parser;\n  var importer = {\n    documents: {},\n    documentPreloadSelectors: IMPORT_SELECTOR,\n    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(\",\"),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log(\"loaded\", url, elt);\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isImportLink(elt)) {\n        var doc = this.documents[url];\n        if (doc === undefined) {\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            this.bootDocument(doc);\n          }\n          this.documents[url] = doc;\n        }\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observer.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));\n  importer.observer = new Observer();\n  function isImportLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n  function isLinkRel(elt, rel) {\n    return elt.localName === \"link\" && elt.getAttribute(\"rel\") === rel;\n  }\n  function makeDocument(resource, url) {\n    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    doc._URL = url;\n    var base = doc.createElement(\"base\");\n    base.setAttribute(\"href\", url);\n    if (!doc.baseURI) {\n      Object.defineProperty(doc, \"baseURI\", {\n        value: url\n      });\n    }\n    var meta = doc.createElement(\"meta\");\n    meta.setAttribute(\"charset\", \"utf-8\");\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    doc.body.innerHTML = resource;\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\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    Object.defineProperty(document, \"baseURI\", baseURIDescriptor);\n    Object.defineProperty(rootDocument, \"baseURI\", baseURIDescriptor);\n  }\n  scope.importer = importer;\n  scope.importLoader = importLoader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var parser = scope.parser;\n  var importer = scope.importer;\n  var dynamic = {\n    added: function(nodes) {\n      var owner, parsed;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        if (!owner) {\n          owner = n.ownerDocument;\n          parsed = parser.isParsed(owner);\n        }\n        loading = this.shouldLoadNode(n);\n        if (loading) {\n          importer.loadNode(n);\n        }\n        if (this.shouldParseNode(n) && parsed) {\n          parser.parseDynamic(n, loading);\n        }\n      }\n    },\n    shouldLoadNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));\n    },\n    shouldParseNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));\n    }\n  };\n  importer.observer.addCallback = dynamic.added.bind(dynamic);\n  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;\n});\n\n(function(scope) {\n  var initializeModules = scope.initializeModules;\n  var isIE = scope.isIE;\n  if (scope.useNative) {\n    return;\n  }\n  if (isIE && 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  initializeModules();\n  var rootDocument = scope.rootDocument;\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(rootDocument);\n  }\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\" && !window.attachEvent) {\n    bootstrap();\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", bootstrap);\n  }\n})(HTMLImports);\n\nwindow.CustomElements = window.CustomElements || {\n  flags: {}\n};\n\n(function(scope) {\n  var flags = scope.flags;\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n  scope.hasNative = Boolean(document.registerElement);\n  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n})(CustomElements);\n\nCustomElements.addModule(function(scope) {\n  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : \"none\";\n  function forSubtree(node, cb) {\n    findAllElements(node, function(e) {\n      if (cb(e)) {\n        return true;\n      }\n      forRoots(e, cb);\n    });\n    forRoots(node, cb);\n  }\n  function findAllElements(node, find, data) {\n    var e = node.firstElementChild;\n    if (!e) {\n      e = node.firstChild;\n      while (e && e.nodeType !== Node.ELEMENT_NODE) {\n        e = e.nextSibling;\n      }\n    }\n    while (e) {\n      if (find(e, data) !== true) {\n        findAllElements(e, find, data);\n      }\n      e = e.nextElementSibling;\n    }\n    return null;\n  }\n  function forRoots(node, cb) {\n    var root = node.shadowRoot;\n    while (root) {\n      forSubtree(root, cb);\n      root = root.olderShadowRoot;\n    }\n  }\n  var processingDocuments;\n  function forDocumentTree(doc, cb) {\n    processingDocuments = [];\n    _forDocumentTree(doc, cb);\n    processingDocuments = null;\n  }\n  function _forDocumentTree(doc, cb) {\n    doc = wrap(doc);\n    if (processingDocuments.indexOf(doc) >= 0) {\n      return;\n    }\n    processingDocuments.push(doc);\n    var imports = doc.querySelectorAll(\"link[rel=\" + IMPORT_LINK_TYPE + \"]\");\n    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {\n      if (n.import) {\n        _forDocumentTree(n.import, cb);\n      }\n    }\n    cb(doc);\n  }\n  scope.forDocumentTree = forDocumentTree;\n  scope.forSubtree = forSubtree;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  var forSubtree = scope.forSubtree;\n  var forDocumentTree = scope.forDocumentTree;\n  function addedNode(node) {\n    return added(node) || addedSubtree(node);\n  }\n  function added(node) {\n    if (scope.upgrade(node)) {\n      return true;\n    }\n    attached(node);\n  }\n  function addedSubtree(node) {\n    forSubtree(node, function(e) {\n      if (added(e)) {\n        return true;\n      }\n    });\n  }\n  function attachedNode(node) {\n    attached(node);\n    if (inDocument(node)) {\n      forSubtree(node, function(e) {\n        attached(e);\n      });\n    }\n  }\n  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;\n  scope.hasPolyfillMutations = hasPolyfillMutations;\n  var isPendingMutations = false;\n  var pendingMutations = [];\n  function deferMutation(fn) {\n    pendingMutations.push(fn);\n    if (!isPendingMutations) {\n      isPendingMutations = true;\n      setTimeout(takeMutations);\n    }\n  }\n  function takeMutations() {\n    isPendingMutations = false;\n    var $p = pendingMutations;\n    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {\n      p();\n    }\n    pendingMutations = [];\n  }\n  function attached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _attached(element);\n      });\n    } else {\n      _attached(element);\n    }\n  }\n  function _attached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (!element.__attached && inDocument(element)) {\n        element.__attached = true;\n        if (element.attachedCallback) {\n          element.attachedCallback();\n        }\n      }\n    }\n  }\n  function detachedNode(node) {\n    detached(node);\n    forSubtree(node, function(e) {\n      detached(e);\n    });\n  }\n  function detached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _detached(element);\n      });\n    } else {\n      _detached(element);\n    }\n  }\n  function _detached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (element.__attached && !inDocument(element)) {\n        element.__attached = false;\n        if (element.detachedCallback) {\n          element.detachedCallback();\n        }\n      }\n    }\n  }\n  function inDocument(element) {\n    var p = element;\n    var doc = wrap(document);\n    while (p) {\n      if (p == doc) {\n        return true;\n      }\n      p = p.parentNode || p.host;\n    }\n  }\n  function watchShadow(node) {\n    if (node.shadowRoot && !node.shadowRoot.__watched) {\n      flags.dom && console.log(\"watching shadow-root for: \", node.localName);\n      var root = node.shadowRoot;\n      while (root) {\n        observe(root);\n        root = root.olderShadowRoot;\n      }\n    }\n  }\n  function handler(mutations) {\n    if (flags.dom) {\n      var mx = mutations[0];\n      if (mx && mx.type === \"childList\" && mx.addedNodes) {\n        if (mx.addedNodes) {\n          var d = mx.addedNodes[0];\n          while (d && d !== document && !d.host) {\n            d = d.parentNode;\n          }\n          var u = d && (d.URL || d._URL || d.host && d.host.localName) || \"\";\n          u = u.split(\"/?\").shift().split(\"/\").pop();\n        }\n      }\n      console.group(\"mutations (%d) [%s]\", mutations.length, u || \"\");\n    }\n    mutations.forEach(function(mx) {\n      if (mx.type === \"childList\") {\n        forEach(mx.addedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          addedNode(n);\n        });\n        forEach(mx.removedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          detachedNode(n);\n        });\n      }\n    });\n    flags.dom && console.groupEnd();\n  }\n  function takeRecords(node) {\n    node = wrap(node);\n    if (!node) {\n      node = wrap(document);\n    }\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    var observer = node.__observer;\n    if (observer) {\n      handler(observer.takeRecords());\n      takeMutations();\n    }\n  }\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  function observe(inRoot) {\n    if (inRoot.__observer) {\n      return;\n    }\n    var observer = new MutationObserver(handler);\n    observer.observe(inRoot, {\n      childList: true,\n      subtree: true\n    });\n    inRoot.__observer = observer;\n  }\n  function upgradeDocument(doc) {\n    doc = wrap(doc);\n    flags.dom && console.group(\"upgradeDocument: \", doc.baseURI.split(\"/\").pop());\n    addedNode(doc);\n    observe(doc);\n    flags.dom && console.groupEnd();\n  }\n  function upgradeDocumentTree(doc) {\n    forDocumentTree(doc, upgradeDocument);\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  scope.watchShadow = watchShadow;\n  scope.upgradeDocumentTree = upgradeDocumentTree;\n  scope.upgradeSubtree = addedSubtree;\n  scope.upgradeAll = addedNode;\n  scope.attachedNode = attachedNode;\n  scope.takeRecords = takeRecords;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  function upgrade(node) {\n    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\n      var is = node.getAttribute(\"is\");\n      var definition = scope.getRegisteredDefinition(is || node.localName);\n      if (definition) {\n        if (is && definition.tag == node.localName) {\n          return upgradeWithDefinition(node, definition);\n        } else if (!is && !definition.extends) {\n          return upgradeWithDefinition(node, definition);\n        }\n      }\n    }\n  }\n  function upgradeWithDefinition(element, definition) {\n    flags.upgrade && console.group(\"upgrade:\", element.localName);\n    if (definition.is) {\n      element.setAttribute(\"is\", definition.is);\n    }\n    implementPrototype(element, definition);\n    element.__upgraded__ = true;\n    created(element);\n    scope.attachedNode(element);\n    scope.upgradeSubtree(element);\n    flags.upgrade && console.groupEnd();\n    return element;\n  }\n  function implementPrototype(element, definition) {\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n  function customMixin(inTarget, inSrc, inNative) {\n    var used = {};\n    var p = inSrc;\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, Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n  function created(element) {\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n  scope.upgrade = upgrade;\n  scope.upgradeWithDefinition = upgradeWithDefinition;\n  scope.implementPrototype = implementPrototype;\n});\n\nCustomElements.addModule(function(scope) {\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  var upgrade = scope.upgrade;\n  var upgradeWithDefinition = scope.upgradeWithDefinition;\n  var implementPrototype = scope.implementPrototype;\n  var useNative = scope.useNative;\n  function register(name, options) {\n    var definition = options || {};\n    if (!name) {\n      throw new Error(\"document.registerElement: first argument `name` must not be empty\");\n    }\n    if (name.indexOf(\"-\") < 0) {\n      throw new Error(\"document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '\" + String(name) + \"'.\");\n    }\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    if (getRegisteredDefinition(name)) {\n      throw new Error(\"DuplicateDefinitionError: a type with name '\" + String(name) + \"' is already registered\");\n    }\n    if (!definition.prototype) {\n      definition.prototype = Object.create(HTMLElement.prototype);\n    }\n    definition.__name = name.toLowerCase();\n    definition.lifecycle = definition.lifecycle || {};\n    definition.ancestry = ancestry(definition.extends);\n    resolveTagName(definition);\n    resolvePrototypeChain(definition);\n    overrideAttributeApi(definition.prototype);\n    registerDefinition(definition.__name, definition);\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    definition.prototype.constructor = definition.ctor;\n    if (scope.ready) {\n      upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n  function overrideAttributeApi(prototype) {\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  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 && newValue !== oldValue) {\n      this.attributeChangedCallback(name, oldValue, newValue);\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  var reservedTagList = [ \"annotation-xml\", \"color-profile\", \"font-face\", \"font-face-src\", \"font-face-uri\", \"font-face-format\", \"font-face-name\", \"missing-glyph\" ];\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([ extendee ]);\n    }\n    return [];\n  }\n  function resolveTagName(definition) {\n    var baseTag = definition.extends;\n    for (var i = 0, a; a = definition.ancestry[i]; i++) {\n      baseTag = a.is && a.tag;\n    }\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      definition.is = definition.__name;\n    }\n  }\n  function resolvePrototypeChain(definition) {\n    if (!Object.__proto__) {\n      var nativePrototype = HTMLElement.prototype;\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\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      definition.native = nativePrototype;\n    }\n  }\n  function instantiate(definition) {\n    return upgradeWithDefinition(domCreateElement(definition.tag), definition);\n  }\n  var registry = {};\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n  var HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n  function createElementNS(namespace, tag, typeExtension) {\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n  function createElement(tag, typeExtension) {\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n    var element;\n    if (typeExtension) {\n      element = createElement(tag);\n      element.setAttribute(\"is\", typeExtension);\n      return element;\n    }\n    element = domCreateElement(tag);\n    if (tag.indexOf(\"-\") >= 0) {\n      implementPrototype(element, HTMLElement);\n    }\n    return element;\n  }\n  function cloneNode(deep) {\n    var n = domCloneNode.call(this, deep);\n    upgrade(n);\n    return n;\n  }\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n  var domCloneNode = Node.prototype.cloneNode;\n  var isInstance;\n  if (!Object.__proto__ && !useNative) {\n    isInstance = function(obj, ctor) {\n      var p = obj;\n      while (p) {\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  document.registerElement = register;\n  document.createElement = createElement;\n  document.createElementNS = createElementNS;\n  Node.prototype.cloneNode = cloneNode;\n  scope.registry = registry;\n  scope.instanceof = isInstance;\n  scope.reservedTagList = reservedTagList;\n  scope.getRegisteredDefinition = getRegisteredDefinition;\n  document.register = document.registerElement;\n});\n\n(function(scope) {\n  var useNative = scope.useNative;\n  var initializeModules = scope.initializeModules;\n  var isIE11OrOlder = /Trident/.test(navigator.userAgent);\n  if (useNative) {\n    var nop = function() {};\n    scope.watchShadow = nop;\n    scope.upgrade = nop;\n    scope.upgradeAll = nop;\n    scope.upgradeDocumentTree = nop;\n    scope.upgradeSubtree = nop;\n    scope.takeRecords = nop;\n    scope.instanceof = function(obj, base) {\n      return obj instanceof base;\n    };\n  } else {\n    initializeModules();\n  }\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  if (!window.wrap) {\n    if (window.ShadowDOMPolyfill) {\n      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n    } else {\n      window.wrap = window.unwrap = function(node) {\n        return node;\n      };\n    }\n  }\n  function bootstrap() {\n    upgradeDocumentTree(wrap(document));\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        upgradeDocumentTree(wrap(elt.import));\n      };\n    }\n    CustomElements.ready = true;\n    setTimeout(function() {\n      CustomElements.readyTime = Date.now();\n      if (window.HTMLImports) {\n        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n      }\n      document.dispatchEvent(new CustomEvent(\"WebComponentsReady\", {\n        bubbles: true\n      }));\n    });\n  }\n  if (isIE11OrOlder && 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  if (document.readyState === \"complete\" || scope.flags.eager) {\n    bootstrap();\n  } else if (document.readyState === \"interactive\" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {\n    bootstrap();\n  } else {\n    var loadEvent = window.HTMLImports && !HTMLImports.ready ? \"HTMLImportsLoaded\" : \"DOMContentLoaded\";\n    window.addEventListener(loadEvent, bootstrap);\n  }\n})(window.CustomElements);\n\n(function(scope) {\n  if (!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})(window.WebComponents);\n\n(function(scope) {\n  \"use strict\";\n  if (!window.performance) {\n    var start = Date.now();\n    window.performance = {\n      now: function() {\n        return Date.now() - start;\n      }\n    };\n  }\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = function() {\n      var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n      return nativeRaf ? function(callback) {\n        return nativeRaf(function() {\n          callback(performance.now());\n        });\n      } : function(callback) {\n        return window.setTimeout(callback, 1e3 / 60);\n      };\n    }();\n  }\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = function() {\n      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {\n        clearTimeout(id);\n      };\n    }();\n  }\n  var elementDeclarations = [];\n  var polymerStub = function(name, dictionary) {\n    if (typeof name !== \"string\" && arguments.length === 1) {\n      Array.prototype.push.call(arguments, document._currentScript);\n    }\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n  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  function installPolymerWarning() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        throw new Error(\"You tried to use polymer without loading it first. To \" + 'load polymer, <link rel=\"import\" href=\"' + 'components/polymer/polymer.html\">');\n      };\n    }\n  }\n  if (HTMLImports.useNative) {\n    installPolymerWarning();\n  } else {\n    addEventListener(\"DOMContentLoaded\", installPolymerWarning);\n  }\n})(window.WebComponents);\n\n(function(scope) {\n  var style = document.createElement(\"style\");\n  style.textContent = \"\" + \"body {\" + \"transition: opacity ease-in 0.2s;\" + \" } \\n\" + \"body[unresolved] {\" + \"opacity: 0; display: block; overflow: hidden; position: relative;\" + \" } \\n\";\n  var head = document.querySelector(\"head\");\n  head.insertBefore(style, head.firstChild);\n})(window.WebComponents);\n\n(function(scope) {\n  window.Platform = scope;\n})(window.WebComponents);"
  },
  {
    "path": "build/mui/mui-button/mui-button.html",
    "content": "<!--\n  `mui-button`\n  @version 1.0.0-alpha2\n  @description MUI button abstraction. Using icons from core-element package.\n-->\n\n<polymer-element name=\"mui-button\" attributes=\"src icon active type\"\n  on-click=\"{{buttonClicked}}\">\n  <template>\n    <style>\n      :host {\n        display: inline-block;\n        box-sizing: border-box;\n        -moz-box-sizing: border-box;\n        vertical-align: middle;\n        width: 48px;\n        height: 48px;\n        background-image: none;\n        border-radius: 2px;\n        padding: 12px 12px;\n        margin: 6px 4px;\n        font-size: 0.7rem;\n        cursor: pointer;\n        color: #546e7a;\n        box-shadow: 0 0 0 1px #b0bec5;\n      }\n      :host([disabled]) {\n        opacity: 0.6;\n        pointer-events: none;\n      }\n      /*:host(.outline) {\n        box-shadow: 0 0 0 1px ;\n      }*/\n      :host(:hover:not([disabled])) {\n        box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1), 0 0 1px 1px rgba(0, 0, 0, 0.2);\n      }\n      :host(.selected:not([disabled])) {\n        color: #03a9f4;\n        /*background-color: #039be5;*/\n        background-color: rgba(0, 0, 0, 0.15);\n        box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.24), 0 0 0 1px rgba(0, 0, 0, 0.28);\n      }\n      :host(:active:not([disabled]), .selected:active:not([disabled])) {\n        background-color: rgba(0, 0, 0, 0.1);\n        box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.24);\n      }\n      core-icon {\n        pointer-events: none;\n      }\n      .title {\n        color: #607d8b;\n        font-family: 'Roboto Condensed', sans-serif;\n        line-height: 1rem;\n        text-align: center;\n        overflow: hidden;\n        margin: 15px -4px;\n      }\n      .title(.selected) {\n        color: #fff;\n      }\n    </style>\n\n    <div>\n      <core-icon src=\"{{ src }}\" icon=\"{{ icon }}\"></core-icon>\n      <div class=\"title\">\n        {{ label }}\n      </div>\n    </div>\n\n  </template>\n\n  <script>\n\n    Polymer({\n\n      /**\n       * The URL of an image for the icon.  Should not use `icon` property\n       * if you are using this property.\n       *\n       * @attribute src\n       * @type string\n       * @default ''\n       */\n      src: '',\n\n      /**\n       * If true, border is placed around the button to indicate it's\n       * active state.\n       *\n       * @attribute active\n       * @type boolean\n       * @default false\n       */\n      active: false,\n\n      /**\n       * Specifies the icon name or index in the set of icons available in\n       * the icon set.  Should not use `src` property if you are using this\n       * property.\n       *\n       * @attribute icon\n       * @type string\n       * @default ''\n       */\n      icon: '',\n\n      // moment or toggle\n      type: 'moment',\n\n      // MUI\n      lable: 'unlabeled',\n      value: false,\n      targetParam: null,\n\n      activeChanged: function() {\n        this.classList.toggle('selected', this.active);\n      },\n\n      // if this is toggle mode, change active when clicked\n      // button => model\n      buttonClicked: function () {\n        if (this.type === 'toggle') {\n          this.active = !this.active;\n        }\n        this.value = this.active;\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method instead\n          this.targetParam.set(this.value);\n        }\n      },\n\n      // model => button\n      update: function () {\n        this.active = this.value;\n      },\n\n      loadTargetParamData: function () {\n        if (this.targetParam) {\n          this.label = this.targetParam.name;\n          this.value = this.targetParam.value;\n          this.update();\n        }\n      },\n\n      link: function (plugin, param) {\n        // get target parameter object\n        this.targetParam = plugin.params[param];\n        // load plugin param data\n        this.loadTargetParamData();\n        // setup path observer to the param\n        var ob = new PathObserver(plugin.params[param], 'value');\n        ob.open(function (newValue, oldValue) {\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n      },\n\n    });\n\n  </script>\n\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-eblock/mui-eblock.html",
    "content": "<!--\n  `mui-eblock`\n  @version 1.0.0-alpha2\n  @description MUI envelope block abstraction.\n-->\n\n<polymer-element name=\"mui-eblock\" attributes=\"type label\">\n  <template>\n    <style>\n    :host {\n      display: inline-block;\n      vertical-align: middle;\n      margin: 2px 2px;\n      width: 86px;\n      height: 70px;\n      -webkit-user-select: none;\n    }\n    .c-frame {\n      fill: #607d8b;\n      stroke: #37474f;\n      stroke-width: 2.5;\n    }\n    .c-frame-selected {\n      fill: #039be5;\n      stroke: #0277bd;\n      stroke-width: 2.5;\n    }\n    .c-line {\n      fill: rgba(255, 255, 255, 0.25);\n      stroke: #eceff1;\n      stroke-width: 1.25;\n    }\n    .c-overlay {\n      fill: #fff;\n      opacity: 0;\n    }\n    .c-overlay-flash {\n      fill: #fff;\n      -webkit-animation-name: flash;\n      -webkit-animation-duration: 0.25s;\n    }\n    @-webkit-keyframes flash {\n      from  { opacity: 0.75; }\n      to    { opacity: 0; }\n    }\n    </style>\n    <svg id=\"eTouchable\" class=\"c-svg\" width=\"86\" height=\"70\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <rect id=\"eFrame\" width=\"86\" height=\"70\" class=\"c-frame\" />\n      <polyline id=\"eLine\" class=\"c-line\" />\n      <rect id=\"eOverlay\" width=\"86\" height=\"70\" class=\"c-overlay\" />\n    </svg>\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      label: 'mui-eblock',\n      values: null,\n      type: 0, // 0:linear env, 1: 1 step, 2:2steps, 3:3steps, 4:4steps\n\n      // internal\n      _width: 86,\n      _height: 70,\n\n      // render UI data\n      render: function () {\n        var points = '';\n        for (var i = 0; i < this.values.length; i++) {\n          points += (this.values[i][0] * this._width) + ',';\n          points += ((1.0 - this.values[i][1]) * this._height) + ' ';\n        }\n        this.$.eLine.setAttributeNS(null, 'points', points);\n      },\n\n      // update: model => knob\n      update: function () {\n        this.render();\n      },\n\n      // post: knob => model\n      post: function (dx, dy) {\n        dx = (dx || 0);\n        dy = (dy || 0);\n        this.values[1][0] += dx / this._width;\n        this.values[1][1] -= dy / this._height;\n        this.values[1][0] = WX.clamp(this.values[1][0], 0.0, 1.0);\n        this.values[1][1] = WX.clamp(this.values[1][1], 0.0, 1.0);\n        this.render();\n      },\n\n      flash: function () {\n        this.$.eOverlay.classList.switch('c-overlay', 'c-overlay-flash');\n        setTimeout(function () {\n          this.$.eOverlay.classList.switch('c-overlay-flash', 'c-overlay');\n        }.bind(this), 250)\n      },\n\n      highlight: function (bool) {\n        if (bool) {\n          this.$.eFrame.classList.switch('c-frame', 'c-frame-selected');\n        } else {\n          this.$.eFrame.classList.switch('c-frame-selected', 'c-frame');\n        }\n      },\n\n      created: function () {\n        // data values: normalized pair of (time, value)\n        this.values = [[0.0, 0.0], [0.15, 0.2], [1.0, 0.0]];\n      },\n\n      ready: function () {\n\n        // mouse responder\n        var prevData = {};\n        var mouseResponder = MUI.MouseResponder(\n          this.label,\n          this.$.eTouchable,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                document.body.style.cursor = 'move';\n                this.highlight(true);\n                prevData = data;\n                break;\n              case 'dragged':\n                switch (this.type) {\n                  case 0:\n                    var dx = data.x - prevData.x,\n                        dy = data.y - prevData.y;\n                    this.post(dx, dy);\n                    break;\n                }\n                this.post();\n                prevData = data;\n                break;\n              case 'released':\n                document.body.style.cursor = 'default';\n                this.post();\n                break;\n            }\n          }.bind(this)\n        );\n\n        // ready & go\n        this.update();\n      },\n\n      getValues: function () {\n        return this.values.slice(0);\n      }\n\n    });\n  </script>\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-group/mui-group.html",
    "content": "<!--\n  `mui-group`\n  @version 1.0.0-alpha2\n  @description MUI group element. A container for multiple elements.\n-->\n\n<polymer-element name=\"mui-group\" attributes=\"label\">\n<template>\n  <style>\n    :host {\n      display: inline-block;\n    }\n    .mui-group-container {\n      position: relative;\n      display: inline-block;\n      margin: 0 6px 10px 0;\n      padding: 0;\n      vertical-align: top;\n    }\n    .mui-group-header {\n      font-family: 'Roboto Condensed', sans-serif;\n      color: #90a4ae;\n      font-size: 0.7rem;\n      line-height: 0.8rem;\n      padding-bottom: 2px;\n      text-align: center;\n      border-bottom: 1px solid #cfd8dc;\n      /* text-transform: uppercase; */\n    }\n  </style>\n  <div class=\"mui-group-container\">\n    <div class=\"mui-group-header\">\n      <span class=\"label\">{{ label }}</span>\n    </div>\n    <div class=\"mui-group-content\">\n      <content></content>\n    </div>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    label: 'Unlabeled'\n\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-knob/mui-knob.html",
    "content": "<!--\n  `mui-knob`\n  @version 1.0.0-alpha2\n  @description MUI knob abstraction.\n-->\n\n<polymer-element name=\"mui-knob\" attributes=\"value min max label\">\n  <template>\n    <style>\n    @-webkit-keyframes flash {\n      from { opacity: 0.5; }\n      to { opacity: 0; }\n    }\n    :host {\n      display: inline-block;\n      vertical-align: middle;\n      margin: 6px 2px;\n      width: 48px;\n      height: 80px;\n      -webkit-user-select: none;\n    }\n    input:focus {\n      outline: none;\n    }\n    .c-knob-label {\n      display: block;\n      color: #607d8b;\n      font-family:'Roboto Condensed', sans-serif;\n      font-size: 0.7rem;\n      height: 16px;\n      line-height: 16px;\n      text-align: center;\n    }\n    .c-knob-flat {\n      display: block;\n      cursor: move;\n    }\n    .c-knob-value {\n      display: block;\n      font-family:'Roboto', sans-serif;\n      font-size: 0.725rem;\n      height: 16px;\n      width: 48px;\n      line-height: 16px;\n      text-align: center;\n      color: #37474f;\n      background-color: #cfd8dc;\n      border-radius: 3px;\n      margin-top: 3px;\n      padding: 0;\n      border: none;\n    }\n    .c-knob-value-select {\n      color: #fff;\n      background-color: #546e7a;\n      box-shadow: inset 0 0 5px #263238;\n    }\n    .c-knob-flat-outer {\n      /*fill: #353D42;*/\n      /*fill: #7E8AA2;*/\n      /*fill: #374140;*/\n      /*fill: #31353D;*/\n      stroke: #cfd8dc;\n      stroke-width: 0.75px;\n      fill: none;\n    }\n    .c-knob-flat-inner {\n      /*fill: #505455;*/\n      /*fill: #EEE;*/\n      /*fill: #D9CB9E;*/\n      /*fill: #445878;*/\n      fill: #b0bec5;\n    }\n    .c-overlay {\n      fill: #e91e63;\n      opacity: 0;\n    }\n    .c-overlay-flash {\n      fill: #e91e63;\n      -webkit-animation-name: flash;\n      -webkit-animation-duration: 0.15s;\n      /*fill: #EEE;*/\n      /*fill: #D9CB9E;*/\n      /*fill: #445878;*/\n      /*fill: #b0bec5;*/\n    }\n    .c-knob-flat-gauge {\n      /*stroke: #0CB4F5;*/\n      /*stroke: #FF9800;*/\n      /*stroke: #DC3522;*/\n      stroke: #039be5;\n      stroke-width: 4px;\n      fill: none;\n    }\n    </style>\n    <div class=\"c-knob-label\">{{label}}</div>\n    <svg id=\"eTouchable\" class=\"c-knob-flat\" width=\"48\" height=\"48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"23\" class=\"c-knob-flat-outer\" />\n      <path id=\"eKnob\" class=\"c-knob-flat-gauge\" />\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"16\" class=\"c-knob-flat-inner\" />\n      <rect id=\"eOverlay\" x=\"0\" y=\"0\" width=\"48\" height=\"48\" rx=\"4\" ry=\"4\" class=\"c-overlay\" />\n    </svg>\n    <input id=\"eValueDisplay\" type=\"text\" class=\"c-knob-value\">\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      // published\n      label: 'unlabeled',\n      value: 0.0,\n      min: 0.0,\n      max: 1.0,\n\n      // binding\n      targetParam: null,\n      cloudMap: null,\n      cloudParam: null,\n\n      // private\n      _normValue: 0.0,\n      _offset: Math.PI * 0.75,\n      _arcPath: null,\n      _arcCenter: 23.5,\n      _arcRadius: 19,\n\n      // counter\n      _counter: 0,\n\n      // render UI data\n      render: function () {\n        var target = this._normValue * Math.PI * 1.5 ;\n        this._arcPath.x = this._arcCenter + this._arcRadius * Math.cos(this._offset + target);\n        this._arcPath.y = this._arcCenter + this._arcRadius * Math.sin(this._offset + target);\n        this._arcPath.largeArcFlag = (target < Math.PI) ? false : true;\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n      },\n\n      flash: function () {\n        this.$.eOverlay.classList.switch(\n          'c-overlay',\n          'c-overlay-flash'\n        );\n        console.log(this.$.eOverlay.classList);\n        setTimeout(function () {\n          this.$.eOverlay.classList.switch(\n            'c-overlay-flash',\n            'c-overlay'\n          );\n        }.bind(this), 150);\n      },\n\n      // update: model => knob\n      update: function () {\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n        this.render();\n      },\n\n      // post: knob => model\n      post: function () {\n        // update target param\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method instead\n          this.targetParam.set(this.value, WX.now + 0.05, 1);\n        }\n        if (this.cloudMap) {\n          this.cloudMap._callbackMUI(this.cloudParam, this.value);\n        }\n        this.render();\n      },\n\n      attributeChanged: function (attrName, oldVal, newVal) {\n        this.update();\n      },\n\n      // created = entry point\n      ready: function () {\n\n        // initialize\n        this.value = parseFloat(this.value);\n        this.min = parseFloat(this.min);\n        this.max = parseFloat(this.max);\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n\n        // create arc path\n        var target = this._normValue * Math.PI * 1.5;\n        var x1 = this._arcCenter + this._arcRadius * Math.cos(this._offset);\n        var y1 = this._arcCenter + this._arcRadius * Math.sin(this._offset);\n        var x2 = this._arcCenter + this._arcRadius * Math.cos(target + this._offset);\n        var y2 = this._arcCenter + this._arcRadius * Math.sin(target + this._offset);\n        var flag = (target < Math.PI) ? 0 : 1;\n        var d = 'M ' + x1 + ' ' + y1 + ' A ' + this._arcRadius + ' ' + this._arcRadius;\n        d += ' 0 ' + flag + ' 1 ' + x2 + ' ' + y2 + ' ';\n        this.$.eKnob.setAttribute('d', d);\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n        this._arcPath = this.$.eKnob.pathSegList.getItem(1);\n\n        // mouse responder\n        var prevData = {};\n        var mouseResponder = MUI.MouseResponder(\n          this.label,\n          this.$.eTouchable,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                prevData = data;\n                document.body.style.cursor = 'move';\n                break;\n              case 'dragged':\n                var delta = ((data.x - prevData.x) || -(data.y - prevData.y)) * ((data.shiftKey) ? 0.001 : 0.01);\n                prevData = data;\n                // norm => val => post\n                this._normValue += delta;\n                this._normValue = Math.min(Math.max(this._normValue, 0.0), 1.0);\n                this.value = this._normValue * (this.max - this.min) + this.min;\n                this.post();\n                break;\n              case 'released':\n                document.body.style.cursor = 'default';\n                this.post();\n                break;\n            }\n          }.bind(this)\n        );\n\n        // keyboard input responder\n        var display = this.$.eValueDisplay;\n        var keyResponder = MUI.KeyResponder(\n          this.label,\n          display,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                display.className += ' c-knob-value-select';\n                display.select();\n                break;\n              case 'keypressed':\n                if (data === 13) {\n                  var v = parseFloat(display.value);\n                  // sanity check\n                  if (!isNaN(v)) {\n                    // val => norm => post\n                    this.value = Math.min(Math.max(v, this.min), this.max);\n                    this._normValue = (this.value - this.min) / (this.max - this.min);\n                    this.post();\n                  }\n                  display.blur();\n                }\n                break;\n              case 'finished':\n                display.className = 'c-knob-value';\n                break;\n            }\n          }.bind(this)\n        );\n\n        // ready & go\n        this.update();\n      },\n\n      loadTargetParamData: function () {\n        if (this.targetParam) {\n          this.label = this.targetParam.name;\n          this.min = this.targetParam.min;\n          this.max = this.targetParam.max;\n          this.value = this.targetParam.value;\n          this.update();\n        }\n      },\n\n      // link to plugin, param and cloudMap\n      link: function (plugin, param, cloudMap) {\n        // get target parameter object\n        this.targetParam = plugin.params[param];\n        // load plugin param data\n        this.loadTargetParamData();\n        // setup path observer to plugin param\n        var obsPlugin = new PathObserver(plugin.params[param], 'value');\n        obsPlugin.open(function (newValue, oldValue) {\n          if (this.value === newValue) return;\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n\n        // OPTIONAL: add param to cloud map data\n        if (cloudMap) {\n          this.cloudMap = cloudMap;\n          this.cloudParam = param;\n          // this.cloudMap.registerParam(param, this.value);\n          // setup path observer to cloud map param\n          var obsCloudMap = new PathObserver(cloudMap.localCache, param);\n          obsCloudMap.open(function (newValue, oldValue) {\n            if (this.value === newValue) return;\n            this.value = newValue;\n            this.update();\n            this.flash();\n            // TEMP: need to update target parameter in plugin too.\n            if (this.targetParam) {\n              this.targetParam.set(this.value, WX.now + 0.05, 1);\n            }\n          }.bind(this));\n        }\n\n      }\n\n    });\n  </script>\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-knobh/mui-knobh.html",
    "content": "<!--\n  `mui-knobh`\n  @version 1.0.0-alpha2\n  @description MUI knob abstraction with horizontal layout.\n-->\n\n<polymer-element name=\"mui-knobh\" attributes=\"value min max label\">\n  <template>\n    <style>\n      :host {\n        display: inline-block;\n        vertical-align: middle;\n        margin: 6px 2px;\n        width: 100px;\n        height: 48px;\n        -webkit-user-select: none;\n      }\n      input:focus {\n        outline: none;\n      }\n      .c-knob-label {\n        display: block;\n        color: #607d8b;\n        font-family:'Roboto Condensed', sans-serif;\n        font-size: 0.7rem;\n        height: 16px;\n        line-height: 16px;\n        text-align: center;\n      }\n      .c-knob-flat {\n        display: block;\n        cursor: move;\n      }\n      .c-knob-value {\n        display: block;\n        font-family:'Roboto', sans-serif;\n        font-size: 0.725rem;\n        height: 16px;\n        width: 48px;\n        line-height: 16px;\n        text-align: center;\n        color: #37474f;\n        background-color: #cfd8dc;\n        border-radius: 3px;\n        margin-top: 3px;\n        padding: 0;\n        border: none;\n      }\n      .c-knob-value-select {\n        color: #fff;\n        background-color: #546e7a;\n        box-shadow: inset 0 0 5px #263238;\n      }\n      .c-right {\n        display: block;\n        float: right;\n        margin-top: 4px;\n      }\n      .c-knob-flat-outer {\n        /*fill: #353D42;*/\n        /*fill: #7E8AA2;*/\n        /*fill: #374140;*/\n        stroke: #cfd8dc;\n        stroke-width: 0.75px;\n        fill: none;\n      }\n      .c-knob-flat-inner {\n        /*fill: #505455;*/\n        /*fill: #EEE;*/\n        /*fill: #D9CB9E;*/\n        fill: #b0bec5;\n      }\n      .c-knob-flat-gauge {\n        /*stroke: #0CB4F5;*/\n        /*stroke: #FF9800;*/\n        /*stroke: #DC3522;*/\n        stroke: #039be5;\n        stroke-width: 4px;\n        fill: none;\n      }\n    </style>\n\n    <div class=\"c-right\">\n      <div class=\"c-knob-label\">{{label}}</div>\n      <input id=\"eValueDisplay\" type=\"text\" class=\"c-knob-value\">\n    </div>\n    <svg id=\"eTouchable\" class=\"c-knob-flat\" width=\"48\" height=\"48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"23\" class=\"c-knob-flat-outer\" />\n      <path id=\"eKnob\" class=\"c-knob-flat-gauge\" />\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"16\" class=\"c-knob-flat-inner\" />\n    </svg>\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      // published\n      label: 'unlabeled',\n      value: 0.0,\n      min: 0.0,\n      max: 1.0,\n\n      // binding\n      targetParam: null,\n      cloudMap: null,\n      cloudParam: null,\n\n      // private\n      _normValue: 0.0,\n      _offset: Math.PI * 0.75,\n      _arcPath: null,\n      _arcCenter: 23.5,\n      _arcRadius: 19,\n\n      // counter\n      _counter: 0,\n\n      // render UI data\n      render: function () {\n        var target = this._normValue * Math.PI * 1.5 ;\n        this._arcPath.x = this._arcCenter + this._arcRadius * Math.cos(this._offset + target);\n        this._arcPath.y = this._arcCenter + this._arcRadius * Math.sin(this._offset + target);\n        this._arcPath.largeArcFlag = (target < Math.PI) ? false : true;\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n      },\n\n      // update: model => knob\n      update: function () {\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n        this.render();\n      },\n\n      // post: knob => model\n      post: function () {\n        // update target param\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method instead\n          this.targetParam.set(this.value, WX.now + 0.05, 1);\n        }\n        if (this.cloudMap) {\n          this.cloudMap.set(this.cloudParam, this.value);\n        }\n        this.render();\n      },\n\n      attributeChanged: function (attrName, oldVal, newVal) {\n        this.update();\n      },\n\n      // created = entry point\n      ready: function () {\n\n        // initialize\n        this.value = parseFloat(this.value);\n        this.min = parseFloat(this.min);\n        this.max = parseFloat(this.max);\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n\n        // create arc path\n        var target = this._normValue * Math.PI * 1.5;\n        var x1 = this._arcCenter + this._arcRadius * Math.cos(this._offset);\n        var y1 = this._arcCenter + this._arcRadius * Math.sin(this._offset);\n        var x2 = this._arcCenter + this._arcRadius * Math.cos(target + this._offset);\n        var y2 = this._arcCenter + this._arcRadius * Math.sin(target + this._offset);\n        var flag = (target < Math.PI) ? 0 : 1;\n        var d = 'M ' + x1 + ' ' + y1 + ' A ' + this._arcRadius + ' ' + this._arcRadius;\n        d += ' 0 ' + flag + ' 1 ' + x2 + ' ' + y2 + ' ';\n        this.$.eKnob.setAttribute('d', d);\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n        this._arcPath = this.$.eKnob.pathSegList.getItem(1);\n\n        // mouse responder\n        var prevData = {};\n        var mouseResponder = MUI.MouseResponder(\n          this.label,\n          this.$.eTouchable,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                prevData = data;\n                document.body.style.cursor = 'move';\n                break;\n              case 'dragged':\n                var delta = ((data.x - prevData.x) || -(data.y - prevData.y)) * ((data.shiftKey) ? 0.001 : 0.01);\n                prevData = data;\n                // norm => val => post\n                this._normValue += delta;\n                this._normValue = Math.min(Math.max(this._normValue, 0.0), 1.0);\n                this.value = this._normValue * (this.max - this.min) + this.min;\n                this.post();\n                break;\n              case 'released':\n                document.body.style.cursor = 'default';\n                this.post();\n                break;\n            }\n          }.bind(this)\n        );\n\n        // keyboard input responder\n        var d = this.$.eValueDisplay;\n        var keyResponder = MUI.KeyResponder(\n          this.label,\n          d,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                d.className += ' c-knob-value-select';\n                d.select();\n                break;\n              case 'keypressed':\n                if (data === 13) {\n                  var v = parseFloat(d.value);\n                  // sanity check\n                  if (!isNaN(v)) {\n                    // val => norm => post\n                    this.value = Math.min(Math.max(v, this.min), this.max);\n                    this._normValue = (this.value - this.min) / (this.max - this.min);\n                    this.post();\n                  }\n                  d.blur();\n                }\n                break;\n              case 'finished':\n                d.className = 'c-knob-value';\n                break;\n            }\n          }.bind(this)\n        );\n\n        // ready & go\n        this.update();\n      },\n\n      loadTargetParamData: function () {\n        if (this.targetParam) {\n          this.label = this.targetParam.name;\n          this.min = this.targetParam.min;\n          this.max = this.targetParam.max;\n          this.value = this.targetParam.value;\n          this.update();\n        }\n      },\n\n      // link to plugin, param and cloudMap\n      link: function (plugin, param, cloudMap) {\n\n        // get target parameter object\n        this.targetParam = plugin.params[param];\n        // load plugin param data\n        this.loadTargetParamData();\n        // setup path observer to plugin param\n        var obsPlugin = new PathObserver(plugin.params[param], 'value');\n        obsPlugin.open(function (newValue, oldValue) {\n          if (this.value === newValue) return;\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n\n        // OPTIONAL: add param to cloud map data\n        if (cloudMap) {\n          this.cloudMap = cloudMap;\n          this.cloudParam = param;\n          // this.cloudMap.registerParam(param, this.value);\n          // setup path observer to cloud map param\n          var obsCloudMap = new PathObserver(cloudMap.localCache, param);\n          obsCloudMap.open(function (newValue, oldValue) {\n            if (this.value === newValue) return;\n            this.value = newValue;\n            this.update();\n            // TEMP: need to update target parameter in plugin too.\n            if (this.targetParam) {\n              this.targetParam.set(this.value, WX.now + 0.05, 1);\n            }\n          }.bind(this));\n        }\n\n      }\n\n    });\n  </script>\n</polymer-element>\n"
  },
  {
    "path": "build/mui/mui-meter/mui-meter.html",
    "content": "<!--\n  `mui-meter`\n  @version 1.0.0-alpha3\n  @description MUI level meter abstraction. Can be considered as AudioNode, to\n    visualize output of AnalyserNode.\n-->\n\n<polymer-element name=\"mui-meter\">\n<template>\n  <style>\n    :host {\n      width: 64px;\n      display: block;\n      overflow: hidden;\n      margin-bottom: 5px;\n    }\n    .mui-meter-container {\n      /*width: 100%;*/\n      position: relative;\n      display: block;\n      vertical-align: top;\n      overflow: hidden;\n    }\n    .mui-meter-toolbar {\n      display: block;\n      height: 28px;\n      background-color: #eee;\n    }\n  </style>\n  <div id=\"eContainer\" class=\"mui-meter-container\">\n    <canvas id=\"eOnScreenCanvas\"></canvas>\n    <div id=\"eValue\"></div>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    _ctx: null,\n    _inlet: null,\n    _buffer: null,\n    _currentLevel: -100,\n    _maxLevelSoFar: -100,\n\n    _levelEstimate: 0.0,\n    _b0_a: 1.0 - Math.exp(-1 / (0.003 * WX.srate)),\n    _b0_r: 1.0 - Math.exp(-1 / (0.006 * WX.srate)),\n\n    _settings: {\n      maxdB: 0.0,\n      mindB: -60.0,\n      grid: true,\n      gridColor: '#333',\n      meterColor: '#03a9f4'\n    },\n\n    _initializeAnalyzer: function () {\n      this._inlet = WX.Analyzer();\n      var bc = this._inlet.frequencyBinCount;\n      this._buffer = new Float32Array(bc);\n      this._settings.nyquist = WX.srate * 0.5;\n      this._settings.binCount = bc;\n      this._settings.binSize = WX.srate / bc;\n      this._settings.logMax = Math.log((bc - 1) / 1.0, 2.0);\n      this._settings.baseX = 0.0;\n      this._settings.unitX = 0.0;\n      this._settings.scaleY = 0.0;\n    },\n\n    _estimateLevel: function (x) {\n      // rms level\n      x = x * x;\n      var delta = x - this._levelEstimate;\n      if (delta > 0) {\n        this._levelEstimate += this._b0_a * delta;\n      } else {\n        this._levelEstimate += this._b0_r * delta;\n      }\n    },\n\n    _resize: function () {\n      this._ctx.canvas.style.width = '100%';\n      this._ctx.canvas.width = this.clientWidth;\n      this._ctx.canvas.height = this.clientHeight;\n      this._settings.baseX = this._ctx.canvas.width / 4.0;\n      this._settings.unitX = this._ctx.canvas.width / this._buffer.length;\n      this._settings.scaleY = this._ctx.canvas.height;\n    },\n\n    _clearCanvas: function () {\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this.clientWidth, this.clientHeight);\n    },\n\n    _drawForeground: function () {\n      var c = this._ctx,\n          s = this._settings,\n          dBGridUnit = 12.0,\n          numUnits = ~~(100 / dBGridUnit);\n      c.lineWidth = 0.4;\n      c.strokeStyle = this._settings.gridColor;\n      c.fillStyle = this._settings.gridColor;\n      c.beginPath();\n      // db grid\n      for (var grid = 0; grid < numUnits; grid++) {\n        var y = grid * c.canvas.height / numUnits;\n        var d = 0.0 + (dBGridUnit * grid);\n        c.moveTo(0.0, y);\n        c.lineTo(c.canvas.width, y);\n        c.fillText(~~(d) + \"dB\", c.canvas.width - 26, y - 3);\n      }\n      c.stroke();\n    },\n\n    _drawBackground: function () {\n    },\n\n    _drawMeter: function () {\n      var c = this._ctx,\n          s = this._settings;\n      // clear and draw grids\n      c.clearRect(0, 0, c.canvas.width, c.canvas.height);\n\n      // if (s.grid) {\n      //   this._drawBackground();\n      // }\n      // // drawing spectrum\n      // c.lineWidth = 1.2;\n      // c.strokeStyle = s.spectrumColor;\n      // c.beginPath();\n      // this._inlet.getFloatFrequencyData(this._buffer);\n      // for(var i = 1; i < s.binCount; i++) {\n      //   if (s.scale === 'lin') {\n      //     c.moveTo(i * s.unitX, s.scaleY);\n      //     c.lineTo(i * s.unitX, (this._buffer[i] * -0.01) * s.scaleY);\n      //   } else {\n      //     var x = c.canvas.width * Math.log(i / 1, s.logBase) / s.logMax;\n      //     c.lineTo(x, (this._buffer[i] * -0.01) * s.scaleY);\n      //   }\n      // }\n      // c.stroke();\n      this._inlet.getFloatTimeDomainData(this._buffer);\n      // for(var i = 1; i < s.binCount; i++) {\n        // if (s.scale === 'lin') {\n        //   c.moveTo(i * s.unitX, s.scaleY);\n        //   c.lineTo(i * s.unitX, (this._buffer[i] * -0.01) * s.scaleY);\n        // } else {\n        //   var x = c.canvas.width * Math.log(i / 1, s.logBase) / s.logMax;\n        //   c.lineTo(x, (this._buffer[i] * -0.01) * s.scaleY);\n        // }\n      // }\n      for (var i = 0; i < this._buffer.length; i+=4) {\n        this._estimateLevel(this._buffer[i]);\n      }\n      var detected = WX.lintodb(Math.sqrt(this._levelEstimate));\n      var height = (100 + detected) / 100 * c.canvas.height;\n      c.fillStyle = this._settings.meterColor;\n      c.fillRect(0, c.canvas.height - height, c.canvas.width, height);\n\n      if (detected > this._maxLevelSoFar) {\n        this.$.eValue.textContent = detected.toString();\n        this._maxLevelSoFar = detected;\n      }\n    },\n\n    _draw: function () {\n      // this._clearCanvas();\n      // this._drawBackground();\n      this._drawMeter();\n      this._drawForeground();\n    },\n\n    update: function () {\n      if (!this._freeze) {\n        this._draw();\n      }\n      requestAnimationFrame(this.update.bind(this));\n    },\n\n    ready: function () {\n\n      // create 2d context\n      this._ctx = this.$.eOnScreenCanvas.getContext('2d');\n\n      // initialization\n      this._initializeAnalyzer();\n      this._resize();\n\n      // UI specific vars\n      var prevData, uy;\n\n      // mouse responder\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this.$.eOnScreenCanvas,\n        function (sender, action, data) {\n          // TODO: needs to be refactored!\n          switch (action) {\n            case 'clicked':\n              break;\n            case 'dragged':\n              break;\n            case 'released':\n              break;\n          }\n          prevData = data;\n        }.bind(this)\n      );\n\n      // start\n      this.update();\n    }\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-pianoroll/mui-pianoroll.html",
    "content": "<polymer-element name=\"mui-pianoroll\">\n\n<template>\n\n  <style>\n    :host {\n      /*width: 100%;*/\n      display: block;\n      overflow: hidden;\n      margin-bottom: 5px;\n      height: 300px;\n    }\n    .mui-pianoroll-container {\n      /*width: 100%;*/\n      position: relative;\n      display: block;\n      vertical-align: top;\n      overflow: hidden;\n    }\n    .mui-pianoroll-toolbar {\n      display: block;\n      height: 28px;\n      background-color: #eee;\n    }\n  </style>\n\n  <div id=\"eContainer\" class=\"mui-pianoroll-container\">\n    <div id=\"eToolbar\" class=\"mui-pianoroll-toolbar\"></div>\n    <canvas id=\"eOnScreenCanvas\"></canvas>\n  </div>\n\n</template>\n\n<script>\n  Polymer('mui-pianoroll', {\n\n    // primary and offscreen context\n    _ctx: null,\n    _ctxos: null,\n\n    _noteclip: null,\n    _selectedNotesId: [],\n    _newNote: null,\n    _newNoteId: null,\n\n    // key responder: internal key data strcuture\n    _keys: [],\n\n    // current viewpoint's virtual coord\n    _cx: 0,\n    _cy: 0,\n\n    // area\n    _minH: 400,\n    _vp: { x: 0, y: 0, w: null, h: null },\n    _ruler: { x: 40, y: 0, w: null, h: 23 },\n    _kbd: { x: 0, y: 23, w: 40, h: null },\n    _grid: { x: 40, y: 23, w: null, h: null },\n\n    // pitchRange (keyboard): C-1 (0) ~ G9 (127)\n    // kbd unit texture height * numOctave + offset\n    _kbdMaxH: 96 * 10 + 64,\n\n    // tiles\n    _tile: {\n      ruler: { x: 40, y: 0, w: 320, h: 23 },\n      kbd: { x: 0, y: 23, w: 40, h: 96},\n      grid: { x: 40, y: 23, w: 320, h: 96 }\n      // lane: { x: 40, y: 119, w: 320, h: 74 }\n    },\n\n    // tick per pixel, pitch per pixel (tick_per_beat = 480)\n    _tickPx: (480 * 4) / 320,\n    _pitchPx: 12 / 96,\n    _pxTick: 320 / (480 * 4),\n    _pxPitch: 96 / 12,\n\n    // dirty flag\n    _needsRedraw: true,\n\n    // action handler variables, marquee area\n    _actionMode: 'IDLE',\n    _marqueeStart: { x: 0, y: 0 },\n    _marqueeEnd: { w: 0, h: 0 },\n\n    // cloud realtime model ref\n    _cloudModel: null,\n\n    // transport object reference\n    _transport: null,\n\n    //\n    // utilities\n    //\n\n    _MIDI2Grid: function (note) {\n      return {\n        x: Math.ceil(note.start * this._pxTick) - this._cx + this._kbd.w,\n        y: Math.floor((130 - note.pitch) * this._pxPitch) - this._cy,\n        w: Math.floor(note.duration * this._pxTick),\n        h: this._pxPitch\n      };\n    },\n\n    _grid2MIDI: function (data) {\n      var nx = this._cx + data.x - this._kbd.w,\n          ny = this._cy + data.y - this._ruler.h;\n      return {\n        pitch: 127 - Math.floor(ny * this._pitchPx),\n        tick: Math.round(nx * this._tickPx)\n      };\n    },\n\n    _grid2MIDIDelta: function (dx, dy) {\n      return {\n        pitch: dy * this._pitchPx,\n        tick: Math.round(dx * this._tickPx)\n      };\n    },\n\n    // this will return action mode\n    _selectNoteAtPos: function (posMIDI) {\n      if (this._noteclip) {\n        // get note id\n        var id = this._noteclip.findNoteIdAtPosition(posMIDI.pitch, posMIDI.tick);\n        // add note id to the selection\n        if (id) {\n          if (this._selectedNotesId.indexOf(id) < 0) {\n            this._selectedNotesId.push(id);\n          }\n          // check if position query was at the end of note (-45 ticks)\n          var note = this._noteclip.get(id);\n          var end = note.getEnd();\n          if (end - 45 <= posMIDI.tick && posMIDI.tick <= end) {\n            return 'RESIZE';\n          }\n          return 'MOVE';\n        }\n      }\n      return null;\n    },\n\n    _selectNotesInMarquee: function () {\n      // get note id bucket\n      var start = this._grid2MIDI(this._marqueeStart),\n          end = this._grid2MIDI(this._marqueeEnd);\n      var minPitch, maxPitch, startTick, endTick;\n      // TODO: arrange min, max accordingly\n      if (start.pitch <= end.pitch) {\n        minPitch = start.pitch;\n        maxPitch = end.pitch;\n      } else {\n        minPitch = end.pitch;\n        maxPitch = start.pitch;\n      }\n      if (start.tick <= end.tick) {\n        startTick = start.tick;\n        endTick = end.tick;\n      } else {\n        startTick = end.tick;\n        endTick = start.tick;\n      }\n      if (this._noteclip) {\n        var notesId = this._noteclip.findNotesIdInArea(\n          minPitch, maxPitch, startTick, endTick\n        );\n        if (notesId) {\n          for (var i = 0; i < notesId.length; i++) {\n            if (this._selectedNotesId.indexOf(notesId[i]) < 0) {\n              this._selectedNotesId.push(notesId[i]);\n            }\n          }\n        }\n      }\n    },\n\n    _moveSelectedNotes: function (deltaMIDI) {\n      var changes = {};\n      for (var i = 0; i < this._selectedNotesId.length; i++) {\n        var id = this._selectedNotesId[i];\n        var note = this._noteclip.get(id);\n        note.translatePitch(deltaMIDI.pitch);\n        note.translateStart(deltaMIDI.tick);\n        changes[id] = note;\n      }\n      if (this._cloudModel) {\n        this._cloudModel._callbackMUI(changes);\n      }\n    },\n\n    _changeNoteLength: function (deltaMIDI) {\n      var changes = {};\n      for (var i = 0; i < this._selectedNotesId.length; i++) {\n        var id = this._selectedNotesId[i],\n            note = this._noteclip.get(id);\n        note.changeDuration(deltaMIDI.tick);\n        changes[id] = note;\n      }\n      if (this._cloudModel) {\n        this._cloudModel._callbackMUI(changes);\n      }\n    },\n\n    _clearNoteSelection: function () {\n      this._selectedNotesId.length = 0;\n    },\n\n    _startNewNote: function (posMIDI) {\n      var start = ~~(posMIDI.tick / 120) * 120;\n      start += (posMIDI.tick % 120) > 60 ? 120 : 0;\n      this._newNote = WX.Note(posMIDI.pitch, 100, start, 120);\n      if (this._noteclip) {\n        this._newNoteId = this._noteclip.push(this._newNote);\n      }\n    },\n\n    _updateNewNote: function (posMIDI) {\n      var duration = posMIDI.tick - this._newNote.start;\n      duration = ~~(duration / 120) * 120;\n      duration += (duration % 120) > 60 ? 120 : 0;\n      this._newNote.duration = duration;\n    },\n\n    _endNewNote: function (posMIDI) {\n      this._updateNewNote(posMIDI);\n      var changes = {};\n      if (this._cloudModel) {\n        changes[this._newNoteId] = this._newNote;\n        this._cloudModel._callbackMUI(changes);\n      }\n      this._newNote = null;\n    },\n\n    _deleteSelectedNotes: function () {\n      var changes = {};\n      for (var i = 0; i < this._selectedNotesId.length; i++) {\n        var id = this._selectedNotesId[i];\n        this._noteclip.delete(id);\n        changes[id] = null;\n      }\n      if (this._cloudModel) {\n        this._cloudModel._callbackMUI(changes);\n      }\n    },\n\n    //\n    // Drawing related\n    //\n\n    _clearCanvas: function () {\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this._kInnerWidth, this._kInnerHeight);\n    },\n\n    _resize: function () {\n      // get current host size\n      this._kInnerWidth = this.clientWidth;\n      this._kInnerHeight =\n        this.clientHeight < this._minH ? this._minH : this.clientHeight;\n      // adjust canvas size\n      this._ctx.canvas.style.width = '100%';\n      this._ctx.canvas.width = this._kInnerWidth;\n      this._ctx.canvas.height = this._kInnerHeight;\n      // adjust key coordinates\n      this._vp.w = this._kInnerWidth;\n      this._vp.h = this._kInnerHeight;\n      this._grid.w = this._kInnerWidth - this._kbd.w;\n      this._grid.h = this._kInnerHeight - this._ruler.h;\n      this._kbd.h = this._grid.h;\n      this._ruler.w = this._grid.w;\n    },\n\n    _loadImageMap: function (callback) {\n      this._imageMap = new Image();\n      this._imageMap.onload = function () {\n        callback();\n      }.bind(this);\n      this._imageMap.src = '../../build/mui/mui-pianoroll/imagemap.png';\n    },\n\n    _buildImageMap: function () {\n      // for smooth moving, pre-render possible workspace background tiles\n      // onto offscreen canvas\n\n      // get rows and cols for tiles with buffer area\n      var numCols = Math.round(this._grid.w / this._tile.grid.w) + 2,\n          numRows = Math.round(this._grid.h / this._tile.grid.h) + 2;\n      var r, c;\n\n      // resize offscreen canvas\n      this._ctxos.canvas.width =\n        this._tile.kbd.w + numCols * this._tile.grid.w;\n      this._ctxos.canvas.height =\n        this._tile.ruler.h + numRows * this._tile.grid.h;\n\n      // draw ruler\n      for (c = 0; c < numCols; c++) {\n        this._ctxos.drawImage(this._imageMap,\n          this._tile.ruler.x, this._tile.ruler.y,\n          this._tile.ruler.w, this._tile.ruler.h,\n          this._tile.ruler.x + c * this._tile.ruler.w, this._tile.ruler.y,\n          this._tile.ruler.w, this._tile.ruler.h\n        );\n        // lane: currently disabled\n        // this._ctxos.drawImage(this._imageMap,\n        //   this._tile.lane.x, this._tile.lane.y,\n        //   this._tile.lane.w, this._tile.lane.h,\n        //   this._tile.lane.x + c * this._tile.lane.w,\n        //   this._vp.h - this._tile.lane.h,\n        //   this._tile.lane.w, this._tile.lane.h\n        // );\n      };\n      // draw kbd\n      for (r = 0; r < numRows; r++) {\n        this._ctxos.drawImage(this._imageMap,\n          this._tile.kbd.x, this._tile.kbd.y,\n          this._tile.kbd.w, this._tile.kbd.h,\n          this._tile.kbd.x, this._tile.ruler.h + r * this._tile.kbd.h,\n          this._tile.kbd.w, this._tile.kbd.h\n        );\n      }\n      // draw grid\n      for (r = 0; r < numRows; r++) {\n        for (c = 0; c < numCols; c++) {\n          this._ctxos.drawImage(this._imageMap,\n            this._tile.grid.x, this._tile.grid.y,\n            this._tile.grid.w, this._tile.grid.h,\n            this._tile.kbd.w + c * this._tile.grid.w,\n            this._tile.ruler.h + r * this._tile.grid.h,\n            this._tile.grid.w, this._tile.grid.h\n          );\n        }\n      }\n    },\n\n    _drawDebug: function () {\n      this._ctx.drawImage(this._ctxos.canvas, 0, 0);\n    },\n\n    _drawForeground: function () {\n      // ruler\n      this._ctx.drawImage(this._ctxos.canvas,\n        // src\n        this._ruler.x + (this._cx % this._tile.ruler.w),\n        this._ruler.y,\n        this._ruler.w,\n        this._ruler.h,\n        // dst\n        this._ruler.x,\n        this._ruler.y,\n        this._ruler.w,\n        this._ruler.h\n      );\n      // playhead\n      if (this._vp.x <= this._playheadPos &&\n        this._playheadPos < this._vp.x + this._vp.w) {\n        this._ctx.beginPath();\n        this._ctx.moveTo(this._playheadPos, this._vp.y);\n        this._ctx.lineTo(this._playheadPos, this._vp.h);\n        this._ctx.strokeStyle = '#fff';\n        this._ctx.stroke();\n      }\n      // keyboard (32 is for G8, 127 offset)\n      this._ctx.drawImage(this._ctxos.canvas,\n        this._kbd.x,\n        this._kbd.y + 32 + (this._cy % this._tile.kbd.h),\n        this._kbd.w,\n        this._kbd.h,\n        this._kbd.x,\n        this._kbd.y,\n        this._kbd.w,\n        this._kbd.h\n      );\n      // draw marquee\n      if (this._actionMode === 'MARQUEE') {\n        this._ctx.strokeStyle = '#fff';\n        this._ctx.strokeRect(\n          this._marqueeStart.x, this._marqueeStart.y,\n          this._marqueeEnd.x - this._marqueeStart.x,\n          this._marqueeEnd.y - this._marqueeStart.y\n        );\n      }\n      // corner\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this._ruler.x, this._kbd.y);\n    },\n\n    _drawBackground: function () {\n      // grid\n      this._ctx.drawImage(this._ctxos.canvas,\n        this._grid.x + (this._cx % this._tile.grid.w),\n        this._grid.y + (this._cy % this._tile.grid.h),\n        this._grid.w,\n        this._grid.h,\n        this._grid.x,\n        this._grid.y,\n        this._grid.w,\n        this._grid.h\n      );\n    },\n\n    _drawNotes: function () {\n      this._ctx.lineWidth = 1.0;\n      if (this._noteclip) {\n        this._noteclip.iterate(function (id, note) {\n            if (note) {\n              // transfrom viewport\n              var pos = this._MIDI2Grid(note);\n              // filter out invisible notes\n              if (this._grid.x + this._grid.w < pos.x) return;\n              if (pos.x + pos.w < this._grid.x) return;\n              if (this._grid.y + this._grid.h < pos.y) return;\n              if (pos.y + pos.h < this._grid.y) return;\n              // draw note\n              if (this._selectedNotesId.indexOf(id) == -1) {\n                this._ctx.strokeStyle = '#000';\n                this._ctx.fillStyle = '#C66';\n              } else {\n                this._ctx.strokeStyle = '#fff';\n                this._ctx.fillStyle = '#D99';\n              }\n              this._ctx.strokeRect(pos.x, pos.y, pos.w, pos.h);\n              this._ctx.fillRect(pos.x, pos.y, pos.w, pos.h);\n              // console.log('drawn', note); // to debug\n            }\n          }.bind(this)\n        );\n      }\n    },\n\n    _scrollByDelta: function (dx, dy) {\n      this._cx -= dx;\n      this._cy -= dy;\n      // boundary checking\n      this._cx = (this._cx < 0) ? 0 : this._cx;\n      this._cy = (this._cy < 0) ? 0 : this._cy;\n      if (this._cy > this._kbdMaxH - this._grid.h) {\n        this._cy = this._kbdMaxH - this._grid.h;\n      }\n    },\n\n    setPlayhead: function (tick) {\n      var pos = Math.ceil(tick * this._pxTick) - this._cx + this._kbd.w;\n      if (pos !== this._playheadPos) {\n        this._playheadPos = pos;\n        this._needsRedraw = true;\n      }\n    },\n\n    reportPlayheadPos: function (tick) {\n      this._transport.setNow(tick);\n    },\n\n    _draw: function () {\n      this._clearCanvas();\n      this._drawBackground();\n      this._drawNotes();\n      this._drawForeground();\n    },\n\n    update: function () {\n      if (this._needsRedraw) {\n        this._draw();\n        this._needsRedraw = false;\n      }\n      requestAnimationFrame(this.update.bind(this));\n    },\n\n    _listenKeyDown: function (event) {\n      if (this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = true;\n      // console.log(event.keyCode);\n      switch (event.keyCode) {\n        case 46: // delete key\n          event.preventDefault();\n          this._deleteSelectedNotes();\n      }\n      this._needsRedraw = true;\n    },\n\n    _listenKeyUp: function (event) {\n      if (!this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = false;\n    },\n\n    _handleAction: function (sender, action, data) {\n\n    },\n\n    ready: function () {\n\n      // create offscreen canvas\n      var offscreen = document.createElement('canvas');\n\n      // create 2d context\n      this._ctx = this.$.eOnScreenCanvas.getContext('2d');\n      this._ctxos = offscreen.getContext('2d');\n\n      // load+build image map and callback when done\n      this._loadImageMap(function () {\n        // resize element height to minimum and clear out\n        this._resize();\n        this._buildImageMap();\n        // this._drawDebug();\n        this._needsRedraw = true;\n        this.update();\n      }.bind(this));\n\n      // UI specific vars\n      var prevData, uy;\n\n      // mouse responder\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this.$.eOnScreenCanvas,\n        function (sender, action, data) {\n          var posMIDI = this._grid2MIDI(data);\n          switch (action) {\n            case 'clicked':\n              if (MUI.isPointInArea(data, this._ruler)) {\n                // report current position to transport\n                this.reportPlayheadPos(posMIDI.tick);\n              } else if (MUI.isPointInArea(data, this._kbd)) {\n                // preview sound\n                // console.log(posMIDI.pitch);\n              } else if (MUI.isPointInArea(data, this._grid)){\n                // if a note clicked\n                if (posMIDI) {\n                  // TODO: shiftkey when selection is not empty\n                  if (!data.shiftKey) {\n                    this._clearNoteSelection();\n                  }\n                  // note end clicked = select, resize\n                  // note clicked = select, move\n                  // note not clicked = null\n                  var actionMode = this._selectNoteAtPos(posMIDI);\n                  if (actionMode) {\n                    this._actionMode = actionMode;\n                    uy = 0;\n                  } else {\n                    // altkey = create a note\n                    if (data.altKey) {\n                      document.body.style.cursor = 'crosshair';\n                      this._startNewNote(posMIDI);\n                      this._actionMode = 'CREATE';\n                    }\n                    // metakey = scroll\n                    else if (data.metaKey) {\n                      document.body.style.cursor = 'all-scroll';\n                      this._actionMode = 'SCROLL';\n                    }\n                    // otherwise, start marquee\n                    else {\n                      this._actionMode = 'MARQUEE';\n                      this._marqueeStart.x = this._marqueeEnd.x = data.x;\n                      this._marqueeStart.y = this._marqueeEnd.y = data.y;\n                    }\n                  }\n                }\n              }\n              this._needsRedraw = true;\n              break;\n            case 'dragged':\n              switch (this._actionMode) {\n                case 'MOVE':\n                  var dx = data.x - prevData.x,\n                      dy = 0;\n                  uy -= data.y - prevData.y;\n                  // quantizing ux by px per pitch\n                  if (uy > this._pxPitch || uy < -this._pxPitch) {\n                    dy = Math.round(uy / this._pxPitch);\n                    uy = uy / this._pxPitch - dy;\n                  }\n                  // translate back to screen coord\n                  dy *= this._pxPitch;\n                  // move notes\n                  this._moveSelectedNotes(this._grid2MIDIDelta(dx, dy));\n                  break;\n                case 'RESIZE':\n                  var dx = data.x - prevData.x;\n                  this._changeNoteLength(this._grid2MIDIDelta(dx, dy));\n                  break;\n                case 'CREATE':\n                  this._updateNewNote(posMIDI);\n                  break;\n                case 'SCROLL':\n                  this._scrollByDelta(data.x - prevData.x, data.y - prevData.y);\n                  break;\n                case 'MARQUEE':\n                  this._marqueeEnd.x += data.x - prevData.x;\n                  this._marqueeEnd.y += data.y - prevData.y;\n                  this._selectNotesInMarquee();\n                  break;\n              }\n              this._needsRedraw = true;\n              break;\n            case 'released':\n              document.body.style.cursor = 'default';\n              if (this._newNote) {\n                this._endNewNote(posMIDI);\n              }\n              this._actionMode = 'IDLE';\n              this._needsRedraw = true;\n              break;\n          }\n          prevData = data;\n          // console.log(this._actionMode);\n        }.bind(this)\n      );\n\n      // keyboard responder\n      window.addEventListener('keydown', this._listenKeyDown.bind(this), false);\n      window.addEventListener('keyup', this._listenKeyUp.bind(this), false);\n\n      // initial location\n      this._scrollByDelta(0, this._kbdMaxH * -0.4);\n    },\n\n    setNoteClip: function (noteclip) {\n      this._noteclip = noteclip;\n      this._needsRedraw = true;\n    },\n\n    //\n    // realtime sync features\n    //\n\n    link: function (rtModel) {\n      this._cloudModel = rtModel;\n      rtModel.view = this;\n    },\n\n    onRealtimeChange: function (id, noteArr) {\n      // console.log('realtimechange', index, noteArr);\n      if (noteArr) {\n        var note = WX.Note(noteArr[0], noteArr[1], noteArr[2], noteArr[3]);\n        this._noteclip.set(id, note);\n      } else {\n        this._noteclip.delete(id);\n      }\n      this._needsRedraw = true;\n    },\n\n    loadNote: function (id, noteArr) {\n      var note = WX.Note(noteArr[0], noteArr[1], noteArr[2], noteArr[3]);\n      this._noteclip.set(id, note);\n      this._needsRedraw = true;\n    }\n\n  });\n</script>\n\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-rack/mui-rack.html",
    "content": "<!--\n  `mui-rack`\n  @version 1.0.0-alpha2\n  @description MUI rack abstraction. A bigger and collapsible container for MUI\n    elements.\n-->\n\n<polymer-element name=\"mui-rack\" attributes=\"label opened disabled\">\n<template>\n  <style>\n    :host {\n      display: block;\n    }\n    .container {\n      padding: 8px;\n      margin: 8px 0;\n      border-radius: 2px;\n      box-shadow: 0 0 3px #898989;\n      background-color: #fff;\n      /*overflow: hidden;*/\n    }\n    .header {\n      font-family:'Roboto', sans-serif;\n      height: 24px;\n      line-height: 24px;\n      color: #b0bec5;\n      font-size: 0.9rem;\n      text-transform: uppercase;\n      /* background-color: #ddd; */\n      /* color: #31353D; */\n    }\n    .header .button {\n      float: right;\n      margin: 0;\n      padding: 0;\n      color: #03a9f4;\n      width: 24px;\n      height: 24px;\n      line-height: 24px;\n      box-shadow: none;\n    }\n    .header .button:hover {\n      box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.12);\n    }\n    .content {\n      margin-top: 4px;\n    }\n    :host(.disabled) {\n      opacity: 0.5;\n      pointer-events: none;\n    }\n  </style>\n  <div class=\"container\">\n    <div class=\"header\">\n      <mui-button id=\"eButton\" class=\"button\" icon=\"expand-more\" on-click=\"{{toggle}}\"></mui-button>\n      {{ label }}\n    </div>\n    <div class=\"content\" id=\"eContent\">\n      <content></content>\n    </div>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    label: 'RACK',\n    target: null,\n    button: null,\n    opened: true,\n    disabled: false,\n\n    update: function () {\n      if (this.opened) {\n        this.target.style.display = 'block';\n        this.button.icon = 'expand-less';\n      } else {\n        this.target.style.display = 'none';\n        this.button.icon = 'expand-more';\n      }\n    },\n\n    ready: function() {\n      this.target = this.$.eContent;\n      this.button = this.$.eButton;\n      this.update();\n    },\n\n    toggle: function() {\n      this.opened = !this.opened;\n      this.update();\n    },\n\n    disabledChanged: function() {\n      this.classList.toggle('disabled', this.disabled);\n    }\n\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-select/mui-select.html",
    "content": "<polymer-element name=\"mui-select\" attributes=\"label key value size\">\n\n  <template>\n    <style>\n      :host {\n        display: inline-block;\n        width: 160px;\n        height: 40px;\n        margin: 6px 4px;\n        vertical-align: top;\n        -webkit-user-select: none;\n      }\n      input:focus {\n        outline: none;\n      }\n      .c-select-view {\n        display: block;\n        width: 95%;\n        height: 24px;\n        line-height: 24px;\n        border-radius: 2px;\n        margin-top: 3px;\n        color: #37474f;\n        background-color: #fff;\n        box-shadow: 0 0 0 1px #cfd8dc;\n        cursor: pointer;\n      }\n      .c-select-view:active {\n        background-color: rgba(0, 0, 0, 0.05);\n        box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.2),\n          0 0 0 1px rgba(0, 0, 0, 0.24);\n      }\n      .c-select-value {\n        width: 119px;\n        height: 24px;\n        padding: 0 4px;\n        line-height: 24px;\n        font-size: 0.8rem;\n        font-family:'Roboto', sans-serif;\n        text-align: left;\n        color: #546e7a;\n      }\n      .c-select-button {\n        float: right;\n        width: 20px;\n        height: 24px;\n        text-align: center;\n        color: #78909c;\n        border-left: 1px solid #cfd8dc;\n      }\n      .c-select-label {\n        display: block;\n        width: 64px;\n        height: 16px;\n        line-height: 16px;\n        font-family:'Roboto Condensed', sans-serif;\n        color: #607d8b;\n        font-size: 11px;\n        font-weight: 400;\n        text-align: left;\n      }\n      .c-select-dropdown {\n        display: none;\n        position: absolute;\n        font-family:'Roboto', sans-serif;\n        padding: 0;\n        background-color: #fff;\n        border-radius: 0 0 3px 3px;\n        border: 1px solid #78909c;\n        vertical-align: top;\n        z-index: 1000;\n      }\n      .c-select-dropdown ul {\n        list-style: none;\n        padding: 0;\n        margin: 0;\n      }\n      li.c-select-dropdown-item {\n        height: 20px;\n        line-height: 20px;\n        font-size: 12px;\n        padding: 2px 5px;\n        text-align: left;\n        width: 124px;\n      }\n      li.c-select-dropdown-item:hover {\n        color: #fff;\n        background-color: #039be5;\n      }\n    </style>\n\n    <div class=\"c-select-label\">{{ label }}</div>\n    <div id=\"eTouchable\" class=\"c-select-view\">\n      <div class=\"c-select-button\" on-click=\"{{menuClicked}}\">&blacktriangledown;</div>\n      <div class=\"c-select-value\" on-click=\"{{menuClicked}}\">{{ key }}</div>\n      <div id=\"eDropdown\" class=\"c-select-dropdown\">\n        <ul>\n          <template id=\"eItems\" class=\"c-select-dropdown\" repeat>\n            <li class=\"c-select-dropdown-item\" on-click=\"{{itemClicked}}\" id=\"{{ value }}\">{{ key }}</li>\n          </template>\n        </ul>\n      </div>\n    </div>\n\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      // published\n      label: 'unlabeled',\n      key: 'not ready yet',\n      value: null,\n      size: 'medium',\n\n      // private\n      _menuShown: false,\n      _modelLoaded: false,\n\n      // binding\n      targetParam: null,\n      cloudMap: null,\n      cloudParam: null,\n\n      // external event handler\n      onItemSelected: null,\n\n      render: function () {\n        this.$.eDropdown.style.display = (this._menuShown) ? 'block' : 'none';\n      },\n\n      // model => knob\n      update: function () {\n        this.key = WX.findKeyByValue(this.$.eItems.model, this.value);\n        this.render();\n      },\n\n      // post: knob => model\n      post: function () {\n        this.value = WX.findValueByKey(this.$.eItems.model, this.key);\n        // update target param\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method\n          this.targetParam.set(this.value);\n        }\n        // GDrive support\n        if (this.cloudMap) {\n          this.cloudMap._callbackMUI(this.cloudParam, this.value);\n        }\n        // external event handler\n        if (this.onItemSelected) {\n          this.onItemSelected(this.value);\n        }\n        this.render();\n      },\n\n      menuClicked: function (event, detail, sender) {\n        if (this._modelLoaded) {\n          event.stopPropagation();\n          this._menuShown = !this._menuShown;\n          this.render();\n        }\n      },\n\n      itemClicked: function (event, detail, sender) {\n        event.stopPropagation();\n        this.key = sender.textContent;\n        this.value = sender.id;\n        this._menuShown = false;\n        this.post();\n        // TODO: detect outside click and close the menu\n      },\n\n      attributeChanged: function (attrName, oldVal, newVal) {\n        this.update();\n      },\n\n      ready: function () {\n        switch (this.size) {\n          case 'small':\n            this.style.width = '120px';\n            break;\n          case 'large':\n            this.style.width = '240px';\n            break;\n        }\n      },\n\n      setModel: function (collection) {\n        this.$.eItems.model = collection;\n        this.key = 'Select...';\n        this._modelLoaded = true;\n      },\n\n      setValue: function (value) {\n        var key = WX.findKeyByValue(this.$.eItems.model, value);\n        if (key) {\n          this.value = value;\n          this.key = key;\n        }\n        this.update();\n      },\n\n      loadTargetParamData: function () {\n        this.setModel(this.targetParam.getModel());\n        this.value = this.targetParam.default;\n        this.label = this.targetParam.name;\n        this.update();\n      },\n\n      link: function (plugin, param, cloudMap) {\n        // setting reference to plugin (ui => pluginparam)\n        this.targetParam = plugin.params[param];\n        // load target param data\n        this.loadTargetParamData();\n        // establish observer\n        var ob = new PathObserver(plugin.params[param], 'value');\n        ob.open(function (newValue, oldValue) {\n          if (this.value === newValue) return;\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n\n        // OPTIONAL: add param to cloud map data\n        if (cloudMap) {\n          this.cloudMap = cloudMap;\n          this.cloudParam = param;\n          // this.cloudMap.registerParam(param, this.value);\n          // setup path observer to cloud map param\n          var obsCloudMap = new PathObserver(cloudMap.localCache, param);\n          obsCloudMap.open(function (newValue, oldValue) {\n            if (this.value === newValue) return;\n            this.value = newValue;\n            this.update();\n            // TEMP: need to update target parameter in plugin too.\n            if (this.targetParam) {\n              this.targetParam.set(this.value, WX.now + 0.05, 1);\n            }\n          }.bind(this));\n        }\n      }\n    });\n  </script>\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-spectrum/mui-spectrum.html",
    "content": "<!--\n  `mui-spectrum`\n  @version 1.0.0-alpha2\n  @description MUI spectrum abstraction. Can be considered as AudioNode, to\n    visualize output of AnalyserNode.\n-->\n\n<polymer-element name=\"mui-spectrum\">\n<template>\n  <style>\n    :host {\n      /*width: 100%;*/\n      display: block;\n      overflow: hidden;\n      margin-bottom: 5px;\n    }\n    .mui-spectrum-container {\n      /*width: 100%;*/\n      position: relative;\n      display: block;\n      vertical-align: top;\n      overflow: hidden;\n    }\n    .mui-spectrum-toolbar {\n      display: block;\n      height: 28px;\n      background-color: #eee;\n    }\n  </style>\n  <div id=\"eContainer\" class=\"mui-spectrum-container\">\n    <div id=\"eToolbar\" class=\"mui-spectrum-toolbar\"></div>\n    <canvas id=\"eOnScreenCanvas\"></canvas>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    _ctx: null,\n    _inlet: null,\n    _buffer: null,\n    _settings: {\n      octave: 10,\n      freqBands: [30, 65, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],\n      nyquist: null,\n      logBase: 2.0,\n      binCount: null,\n      binSize: null,\n      logMax: null,\n      baseX: null,\n      unitX: null,\n      scaleY: null,\n      smoothing: 0.5,\n      maxdB: 0.0,\n      mindB: -60.0,\n      scale: 'log',\n      grid: true,\n      gridColor: '#90a4ae',\n      spectrumColor: '#03a9f4',\n    },\n\n    // dirty flag\n    _freeze: false,\n\n    // key resnpoder flag\n    _keys: [],\n\n    _initializeAnalyzer: function () {\n      this._inlet = WX.Analyzer();\n      var bc = this._inlet.frequencyBinCount;\n      this._buffer = new Float32Array(bc);\n      this._settings.nyquist = WX.srate * 0.5;\n      this._settings.binCount = bc;\n      this._settings.binSize = WX.srate / bc;\n      this._settings.logMax = Math.log((bc - 1) / 1.0, 2.0);\n      this._settings.baseX = 0.0;\n      this._settings.unitX = 0.0;\n      this._settings.scaleY = 0.0;\n    },\n\n    _resize: function () {\n      this._ctx.canvas.style.width = '100%';\n      this._ctx.canvas.width = this.clientWidth;\n      this._ctx.canvas.height = this.clientHeight;\n      this._settings.baseX = this._ctx.canvas.width / 4.0;\n      this._settings.unitX = this._ctx.canvas.width / this._buffer.length;\n      this._settings.scaleY = this._ctx.canvas.height;\n    },\n\n    _clearCanvas: function () {\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this.clientWidth, this.clientHeight);\n    },\n\n    _drawForeground: function () {\n    },\n\n    _drawBackground: function () {\n      var c = this._ctx,\n          s = this._settings,\n          numGrid = s.mindB / -6.0;\n      c.lineWidth = 0.4;\n      c.strokeStyle = this._settings.gridColor;\n      c.fillStyle = this._settings.gridColor;\n      c.beginPath();\n      // freq grid\n      for (var oct = 0; oct < s.octave; oct++) {\n        var x = oct * c.canvas.width / s.octave;\n        var f = s.nyquist * Math.pow(2.0, oct - s.octave);\n        c.moveTo(x, 0.0);\n        c.lineTo(x, c.canvas.height);\n        c.fillText(~~(f) + \"Hz\", x + 4, c.canvas.height - 6);\n      }\n      // db grid\n      for (var grid = 0; grid < numGrid; grid++) {\n        var y = grid * c.canvas.height / numGrid;\n        var d = 0.0 + (6 * grid);\n        c.moveTo(0.0, y);\n        c.lineTo(c.canvas.width, y);\n        c.fillText(~~(d) + \"dB\", c.canvas.width - 26, y - 6);\n      }\n      c.stroke();\n    },\n\n    _drawSpectrum: function () {\n      var c = this._ctx,\n          s = this._settings;\n      // clear and draw grids\n      c.clearRect(0, 0, c.canvas.width, c.canvas.height);\n      if (s.grid) {\n        this._drawBackground();\n      }\n      // drawing spectrum\n      c.lineWidth = 1.2;\n      c.strokeStyle = s.spectrumColor;\n      c.beginPath();\n      this._inlet.getFloatFrequencyData(this._buffer);\n      for(var i = 1; i < s.binCount; i++) {\n        if (s.scale === 'lin') {\n          c.moveTo(i * s.unitX, s.scaleY);\n          c.lineTo(i * s.unitX, (this._buffer[i] * -0.01) * s.scaleY);\n        } else {\n          var x = c.canvas.width * Math.log(i / 1, s.logBase) / s.logMax;\n          c.lineTo(x, (this._buffer[i] * -0.01) * s.scaleY);\n        }\n      }\n      c.stroke();\n    },\n\n    _draw: function () {\n      // this._clearCanvas();\n      this._drawBackground();\n      this._drawSpectrum();\n      this._drawForeground();\n    },\n\n    update: function () {\n      if (!this._freeze) {\n        this._draw();\n      }\n      requestAnimationFrame(this.update.bind(this));\n    },\n\n    _listenKeyDown: function (event) {\n      if (this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = true;\n      // console.log(event.keyCode);\n      switch (event.keyCode) {\n        // case 46: // delete key\n        //   this._deleteSelectedNotes();\n      }\n    },\n\n    _listenKeyUp: function (event) {\n      if (!this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = false;\n    },\n\n    ready: function () {\n\n      // create 2d context\n      this._ctx = this.$.eOnScreenCanvas.getContext('2d');\n\n      // initialization\n      this._initializeAnalyzer();\n      this._resize();\n\n      // UI specific vars\n      var prevData, uy;\n\n      // mouse responder\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this.$.eOnScreenCanvas,\n        function (sender, action, data) {\n          // TODO: needs to be refactored!\n          switch (action) {\n            case 'clicked':\n              break;\n            case 'dragged':\n              break;\n            case 'released':\n              break;\n          }\n          prevData = data;\n        }.bind(this)\n      );\n\n      // keyboard responder\n      // window.addEventListener('keydown', this._listenKeyDown.bind(this), false);\n      // window.addEventListener('keyup', this._listenKeyUp.bind(this), false);\n\n      // start\n      this.update();\n    }\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "build/mui/mui-vkey/mui-vkey.html",
    "content": "<!--\n  `mui-vkey`\n  @version 1.0.0-alpha3\n  @description MUI virtual keybaord. Responds to key and mouse input.\n-->\n\n<polymer-element name=\"mui-vkey\" attributes=\"label captureKeyboard\">\n\n<template>\n\n  <style>\n    :host {\n      display: block;\n      overflow: hidden;\n    }\n    .mui-vkey-container {\n    }\n    .mui-vkey-header {\n      margin: 0 0 6px 0;\n    }\n    .mui-vkey-header .button {\n      padding: 2px 2px;\n      width: 28px;\n      height: 28px;\n      box-shadow: none;\n      box-shadow: 0 0 0 1px #cfd8dc;\n      margin: 1px;\n    }\n    /*.header .button:hover {\n      box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.1);\n    }*/\n    .c-display {\n      display: inline-block;\n      vertical-align: middle;\n      text-align: center;\n      font-family:'Roboto Condensed', sans-serif;\n      font-size: 0.7rem;\n      height: 25px;\n      line-height: 25px;\n      padding-top: 3px;\n      border-radius: 1px;\n      color: #00796b;\n      background-color: #b2dfdb;\n      box-shadow: inset 0 1px 1px 1px rgba(0, 0, 0, 0.2), 0px 0px 1px 0px rgba(0, 0, 0, 0.24);\n    }\n    .mui-vkey-octave {\n      width: 48px;\n    }\n    .mui-vkey-message {\n      float: right;\n      width: 100px;\n      margin: 1px;\n    }\n    .c-vkey {\n      display: block;\n      cursor: move;\n      background-color: #cfd8dc;\n      border-radius: 1px;\n    }\n    .c-wheel {\n      stroke: #78909c;\n      stroke-width: 1px;\n      fill: #fff;\n    }\n    .c-wheel-pos {\n      fill: #039be5;\n    }\n    .c-white-key {\n      fill: #fff;\n    }\n    .c-black-key {\n      fill: #607d8b;\n    }\n    .active {\n      fill: #039be5;\n    }\n  </style>\n\n  <div class=\"mui-vkey-container\">\n    <div class=\"mui-vkey-header\">\n      <div id=\"eMsgPanel\" class=\"c-display mui-vkey-message\">HELLO</div>\n      <mui-button class=\"mui-vkey-header button\" icon=\"hardware:keyboard\" type=\"toggle\" on-click=\"{{ toggleKeyboardInput }}\" active=\"true\"></mui-button>\n      <mui-button class=\"mui-vkey-header button\" icon=\"chevron-left\" on-click=\"{{ octaveDown }}\"></mui-button>\n      <div class=\"c-display mui-vkey-octave\">{{ _octaveStr }} oct.</div>\n      <mui-button class=\"mui-vkey-header button\" icon=\"chevron-right\" on-click=\"{{ octaveUp }}\"></mui-button>\n    </div>\n    <svg id=\"eTouchable\" class=\"c-vkey\" height=\"100\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <rect class=\"c-wheel\" x=\"6\" y=\"6\" width=\"32\" height=\"88\" rx=\"2\" ry=\"2\"></rect>\n      <rect class=\"c-wheel\" x=\"44\" y=\"6\" width=\"32\" height=\"88\" rx=\"2\" ry=\"2\"></rect>\n      <rect id=\"ePitWhlPos\" class=\"c-wheel-pos\" x=\"7\" y=\"50\" width=\"30\" height=\"2\"></rect>\n      <rect id=\"eModWhlPos\" class=\"c-wheel-pos\" x=\"45\" y=\"88\" width=\"30\" height=\"2\"></rect>\n    </svg>\n  </div>\n\n</template>\n\n<script>\n  Polymer({\n\n    // public parameter\n    label: 'mui-vkey',\n    octave: 0,\n    captureKeyboard: true,\n\n    // internal parameter\n    _octaveOffset: 24,\n    _octaveStr: '0',\n    _numKeys: 61, // 61keys, 5 octaves\n\n    // key rendering parameters\n    _svgWidth: 787,\n    _offset: 80,\n    _keyUpperY: 6,\n    _keyLowerY: 52,\n    _keyWidth: 18,\n    _keyHeight: 42,\n    _keyPaddingX: 1,\n    _keyRadius: 1.5,\n\n    // primary svg DOM object\n    _svg: null,\n    // internal key data strcuture\n    _keys: [],\n    // previous pitch (for mouse)\n    _prevPitch: null,\n\n    // keyCodeMap: zsxdcvgbhnjm q2w3er5t6y7u i\n    _keyCodes: [\n      90, 83, 88, 68, 67, 86, 71, 66, 72, 78, 74, 77,\n      81, 50, 87, 51, 69, 82, 53, 84, 54, 89, 55, 85, 73\n    ],\n\n    // target plug-ins\n    _targets: [],\n\n\n    /**\n     * Internal methods\n     */\n\n    // helper: 2d area detection\n    _checkKeyArea: function (data) {\n      if (data) {\n        for (var i = 0; i < this._keys.length; i++) {\n          var key = this._keys[i];\n          // check y first\n          if (key.y1 <= data.y && data.y <= key.y2) {\n            // then check x\n            if (key.x1 <= data.x && data.x <= key.x2) {\n              return i;\n            }\n          }\n        }\n      }\n      return null;\n    },\n\n    // helper: check p/mod wheel area\n    _checkWheelArea: function (data) {\n      if (data) {\n        // check pwheel\n        if (6 <= data.x && data.x <= 38) {\n          if (6 <= data.y && data.y <= 94) {\n            console.log('pwheel touched', (data.y - 6) / 88);\n          }\n        }\n        // check modwheel\n        if (44 <= data.x && data.x <= 76) {\n          if (6 <= data.y && data.y <= 94) {\n            console.log('modwheel touched', (data.y - 6) / 88);\n          }\n        }\n      }\n    },\n\n    // helper: key render methods\n    _renderKey: function (key) {\n      var rect = document.createElementNS(\"http://www.w3.org/2000/svg\", 'rect');\n      rect.setAttribute('x', key.x1);\n      rect.setAttribute('y', key.y1);\n      rect.setAttribute('rx', this._keyRadius);\n      rect.setAttribute('ry', this._keyRadius);\n      rect.setAttribute('width', this._keyWidth);\n      rect.setAttribute('height', this._keyHeight);\n      rect.setAttribute('class', key.white ? 'c-white-key' : 'c-black-key');\n      this._svg.appendChild(rect);\n      return rect;\n    },\n\n    // building keyboard\n    _buildKeys: function () {\n      var i = 0, count = 0;\n      while (count < this._numKeys) {\n        var pclass = i % 14;\n        i++;\n        if (pclass === 5 || pclass === 13) continue;\n        var white = (pclass % 2 === 0),\n            x1 = this._offset + i * ((this._keyWidth + this._keyPaddingX) / 2),\n            y1 = white ? this._keyLowerY : this._keyUpperY,\n            x2 = x1 + this._keyWidth,\n            y2 = y1 + this._keyHeight;\n        var key = {\n          white: white, state: false,\n          x1: x1, y1: y1, x2: x2, y2: y2\n        };\n        key.rect = this._renderKey(key);\n        this._keys[count] = key;\n        count++;\n      }\n    },\n\n    // highlight key\n    // TO FIX: this needs to be optimized (just change color, not style)\n    _highlight: function (pitch, highlight) {\n      var key = this._keys[pitch];\n      if (key) {\n        if (highlight) {\n          key.rect.setAttribute('class', key.rect.getAttribute('class') + ' active');\n        } else {\n          key.rect.setAttribute('class', key.rect.getAttribute('class').slice(0, 11));\n        }\n      }\n      // if (pitch !== null) {\n      //   var key = this._keys[pitch];\n      //   if (key) {\n      //     key.rect.setAttribute('class', key.rect.getAttribute('class') + ' active');\n      //   }\n      // }\n      // if (this._prevPitch !== null) {\n      //   key = this._keys[this._prevPitch];\n      //   if (key) {\n      //     key.rect.setAttribute('class', key.rect.getAttribute('class').slice(0, 11));\n      //   }\n      // }\n    },\n\n    _displayMessage: function (msg) {\n      this.$.eMsgPanel.textContent = msg;\n    },\n\n    // action: { on, off, pitchwheel, modwheel }\n    // data: on[pitch, velo] off[pitch,velo] pitchwheel[value], modwheel[value]\n    _dispatch: function (sender, action, data) {\n      // dispatch 'action' and 'data' to all connected destination\n      for (var i = 0; i < this._targets.length; i++) {\n        var plugin = this._targets[i].onData(action, data);\n      }\n    },\n\n\n    /**\n     * dispatch helpers\n     */\n\n    _keyOn: function (pitch, velocity) {\n      if (pitch !== null) {\n        var xpitch = pitch + this._octaveOffset + this.octave * 12;\n        this._dispatch(this.label, 'noteon', {\n          pitch: xpitch,\n          velocity: velocity,\n          time: WX.now\n        });\n        this._displayMessage('NOTE ON ' + xpitch);\n        this._highlight(pitch, true);\n      }\n    },\n\n    _keyOff: function (pitch) {\n      var xpitch = pitch + this._octaveOffset + this.octave * 12;\n      this._dispatch(this.label, 'noteoff', {\n        pitch: xpitch,\n        velocity: 0,\n        time: WX.now\n      });\n      this._displayMessage('NOTE OFF');\n      this._highlight(pitch, false);\n    },\n\n    _setPitchWheel: function (value) {\n      this._dispatch(this.label, 'pitchwheel', { value: value });\n      this._displayMessage('PWHEEL ' + value.toFixed(2));\n      this.$.ePitWhlPos.setAttribute('y', 7 + (84 - value * 84));\n    },\n\n    _setModWheel: function (value) {\n      this._dispatch(this.label, 'modwheel', { value: value });\n      this._displayMessage('MWHEEL ' + value.toFixed(2));\n      this.$.eModWhlPos.setAttribute('y', 7 + (84 - value * 84));\n    },\n\n    /**\n     * Key Event Hanlders\n     */\n\n    _listenKeyDown: function (event) {\n      if (!this.captureKeyboard) return;\n      var pitch = this._keyCodes.indexOf(event.keyCode);\n      if (pitch > -1) {\n        if (this._keys[pitch].state) return;\n        this._keys[pitch].state = true;\n        this._keyOn(pitch + this._octaveOffset + this.octave * 12, 100);\n      }\n    },\n\n    _listenKeyUp: function (event) {\n      if (!this.captureKeyboard) return;\n      var pitch = this._keyCodes.indexOf(event.keyCode);\n      if (pitch > -1) {\n        if (this._keys[pitch].state) {\n          this._keys[pitch].state = false;\n          this._keyOff(pitch + this._octaveOffset + this.octave * 12);\n        }\n      }\n    },\n\n    // return action, data1, data2\n    // TO FIX: redesign interaction...\n    _mouseCallback: function (sender, action, data) {\n      if (data) {\n        if (6 <= data.y && data.y <= 94) {\n          switch (action) {\n            case 'clicked':\n              if (6 <= data.x && data.x <= 38) { // check pwheel\n                this._setPitchWheel(1.0 - (data.y - 6) / 88);\n              } else if (44 <= data.x && data.x <= 76) { // check modwheel\n                this._setModWheel(1.0 - (data.y - 6) / 88);\n              } else if (this._offset <= data.x && data.x <= this._svgWidth) { // check keys\n                for (var i = 0; i < this._keys.length; i++) {\n                  var key = this._keys[i];\n                  // check y first\n                  if (key.y1 <= data.y && data.y <= key.y2) {\n                    // then check x\n                    if (key.x1 <= data.x && data.x <= key.x2) {\n                      this._keyOn(i, 100);\n                      this._prevPitch = i;\n                    }\n                  }\n                }\n              }\n              break;\n\n            case 'dragged':\n              if (6 <= data.x && data.x <= 38) { // check pwheel\n                this._setPitchWheel(1.0 - (data.y - 6) / 88);\n              } else if (44 <= data.x && data.x <= 76) { // check modwheel\n                this._setModWheel(1.0 - (data.y - 6) / 88);\n              } else if (this._offset <= data.x && data.x <= this._svgWidth) { // check keys\n                var validKeyFound = false;\n                for (var i = 0; i < this._keys.length; i++) {\n                  var key = this._keys[i];\n                  // check y first\n                  if (key.y1 <= data.y && data.y <= key.y2) {\n                    // then check x\n                    if (key.x1 <= data.x && data.x <= key.x2) {\n                      // check for transition and then trigger\n                      if (this._prevPitch !== i) {\n                        this._keyOff(this._prevPitch);\n                        this._keyOn(i, 100);\n                        this._prevPitch = i;\n                      }\n                      // found a key. break the loop.\n                      validKeyFound = true;\n                      break;\n                    }\n                  }\n                }\n                // pointer is at invalid area. release previous pitch.\n                if (!validKeyFound) {\n                  if (this._prevPitch) {\n                    this._keyOff(this._prevPitch);\n                    this._prevPitch = null;\n                  }\n                }\n              }\n              break;\n\n            case 'released':\n              if (this._offset <= data.x && data.x <= this._svgWidth) { // check keys\n                for (var i = 0; i < this._keys.length; i++) {\n                  var key = this._keys[i];\n                  // check y first\n                  if (key.y1 <= data.y && data.y <= key.y2) {\n                    // then check x\n                    if (key.x1 <= data.x && data.x <= key.x2) {\n                      this._keyOff(i);\n                      this._prevPitch = null;\n                    }\n                  }\n                }\n              }\n              break;\n          }\n        } else {\n          // invalid area, release previous pitch\n          if (this._prevPitch) {\n            this._keyOff(this._prevPitch);\n            this._prevPitch = null;\n          }\n        }\n      }\n    },\n\n    /**\n     * Polymer-system methods\n     */\n\n    ready: function() {\n      // set svg box size\n      this._svg = this.$.eTouchable;\n      this._svg.setAttribute('width', '100%');\n      // build keys\n      this._buildKeys();\n\n      // hook mouse event listener\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this._svg,\n        this._mouseCallback.bind(this)\n      );\n\n      // key listeners\n      window.addEventListener('keydown', this._listenKeyDown.bind(this), false);\n      window.addEventListener('keyup', this._listenKeyUp.bind(this), false);\n    },\n\n    /**\n     * DOM UI handlers\n     */\n\n    toggleKeyboardInput: function () {\n      this.captureKeyboard = !this.captureKeyboard;\n    },\n\n    octaveUp: function () {\n      this.octave++;\n      this._octaveStr = (this.octave > 0 ? '+' : '') + this.octave.toString();\n    },\n\n    octaveDown: function () {\n      this.octave--;\n      this._octaveStr = (this.octave > 0 ? '+' : '') + this.octave.toString();\n    },\n\n    /**\n     * Exports\n     */\n\n    addTarget: function (target) {\n      this._targets.push(target);\n    },\n\n    removeTarget: function (target) {\n      var idx = this._targets.indexOf(target);\n      if (idx > -1) {\n        this._targets.splice(idx, 1);\n      }\n    },\n\n  });\n</script>\n\n</polymer-element>"
  },
  {
    "path": "build/mui/mui.html",
    "content": "<!-- MUI fonts: Roboto and Roboto Condensed -->\n<link href='http://fonts.googleapis.com/css?family=Roboto:300,700,400'\n  rel='stylesheet' type='text/css'>\n<link href='http://fonts.googleapis.com/css?family=Roboto+Condensed:300,700,400'\n  rel='stylesheet' type='text/css'>\n\n<!-- Polymer and Core Icon -->\n<link rel=\"import\" href=\"bower_components/polymer/polymer.html\">\n<link rel=\"import\" href=\"bower_components/core-icon/core-icon.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/core-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/av-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/communication-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/hardware-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/social-icons.html\">\n\n<!-- MUI elements -->\n<link rel=\"import\" href=\"mui-button/mui-button.html\">\n<link rel=\"import\" href=\"mui-group/mui-group.html\">\n<link rel=\"import\" href=\"mui-knob/mui-knob.html\">\n<link rel=\"import\" href=\"mui-knobh/mui-knobh.html\">\n<link rel=\"import\" href=\"mui-meter/mui-meter.html\">\n<link rel=\"import\" href=\"mui-rack/mui-rack.html\">\n<link rel=\"import\" href=\"mui-select/mui-select.html\">\n<link rel=\"import\" href=\"mui-spectrum/mui-spectrum.html\">\n<link rel=\"import\" href=\"mui-vkey/mui-vkey.html\">\n<link rel=\"import\" href=\"mui-pianoroll/mui-pianoroll.html\">\n<link rel=\"import\" href=\"mui-eblock/mui-eblock.html\">"
  },
  {
    "path": "build/mui/mui.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\nwindow.MUI = {};\n\n/**\n * Mouse responder. 2D coordinate detection and event handler.\n * @class\n * @param {String} senderID Specified Sender ID.\n * @param {Object} targetElement Target DOM element.\n * @param {Function} MUICallback Event-handling callback.\n */\nfunction MouseResponder(senderID, targetElement, MUICallback) {\n  this.senderId = senderID;\n  this.container = targetElement;\n  this.callback = MUICallback;\n  // bound function references\n  this.ondragged = this.dragged.bind(this);\n  this.onreleased = this.released.bind(this);\n  // timestamp\n  this._prevTS = 0;\n  // init with onclick\n  this.onclicked(targetElement);\n}\n\nMouseResponder.prototype = {\n\n  getEventData: function (event) {\n    var r = this.container.getBoundingClientRect();\n    return {\n      x: event.clientX - r.left,\n      y: event.clientY - r.top,\n      ctrlKey: event.ctrlKey,\n      altKey: event.altKey,\n      shiftKey: event.shiftKey,\n      metaKey: event.metaKey\n    };\n  },\n\n  onclicked: function (target) {\n    target.addEventListener('mousedown', function (event) {\n      event.preventDefault();\n      this._prevTS = event.timeStamp;\n      var p = this.getEventData(event);\n      this.callback(this.senderId, 'clicked', p);\n      window.addEventListener('mousemove', this.ondragged, false);\n      window.addEventListener('mouseup', this.onreleased, false);\n    }.bind(this), false);\n  },\n\n  dragged: function (event) {\n    event.preventDefault();\n    if (event.timeStamp - this._prevTS < 16.7) {\n      return;\n    }\n    this._prevTS = event.timeStamp;\n    var p = this.getEventData(event);\n    this.callback(this.senderId, 'dragged', p);\n  },\n\n  released: function (event) {\n    event.preventDefault();\n    var p = this.getEventData(event);\n    this.callback(this.senderId, 'released', p);\n    window.removeEventListener('mousemove', this.ondragged, false);\n    window.removeEventListener('mouseup', this.onreleased, false);\n  }\n\n};\n\n/**\n * Keyboard responder, the keyboard event handler.\n * @class\n * @param {String} senderID Specified Sender ID.\n * @param {Object} targetElement Target DOM element.\n * @param {Function} MUICallback Event-handling callback.\n */\nfunction KeyResponder(senderID, targetElement, MUICallback) {\n  this.senderId = senderID;\n  this.container = targetElement;\n  this.callback = MUICallback;\n  // bound function references\n  this.onkeypress = this.keypressed.bind(this);\n  this.onblur = this.finished.bind(this);\n  // init with onclick\n  this.onfocus(targetElement);\n}\n\n\nKeyResponder.prototype = {\n\n  onfocus: function () {\n    this.container.addEventListener('mousedown', function (event) {\n      this.callback(this.senderId, 'clicked', null);\n      this.container.addEventListener('keypress', this.onkeypress, false);\n      this.container.addEventListener('blur', this.onblur, false);\n    }.bind(this), false);\n  },\n\n  keypressed: function (event) {\n    this.callback(this.senderId, 'keypressed', event.keyCode);\n  },\n\n  finished: function (event) {\n    this.callback(this.senderId, 'finished', null);\n    this.container.removeEventListener('keypress', this.onkeypress, false);\n    this.container.removeEventListener('blur', this.onblur, false);\n  }\n\n};\n\n\nMUI.$ = function (elementId) {\n  return document.getElementById(elementId);\n};\n\nMUI.start = function (onreadyFn) {\n  // check up depedency: platform\n  if (WX.isObject(window.Platform)) {\n    // start function when polymer is ready\n    window.addEventListener('polymer-ready', onreadyFn);\n  } else {\n    WX.Log.error('FATAL: WebComponentPolyfill/Polymer is not loaded.');\n  }\n};\n\nMUI.isPointInArea = function (point, area) {\n  return (area.x <= point.x && point.x <= area.x + area.w) &&\n    (area.y <= point.y && point.y <= area.y + area.h);\n};\n\nMUI.buildControls = function (plugin, targetId) {\n  var targetEl = document.getElementById(targetId);\n  targetEl.label = plugin.info.name;\n  for (var param in plugin.params) {\n    var p = plugin.params[param];\n    switch (p.type) {\n      case 'Generic':\n        var knob = document.createElement('mui-knob');\n        knob.link(plugin, param);\n        targetEl.appendChild(knob);\n        break;\n      case 'Itemized':\n        var select = document.createElement('mui-select');\n        select.link(plugin, param);\n        targetEl.appendChild(select);\n        break;\n      case 'Boolean':\n        var button = document.createElement('mui-button');\n        button.type = 'toggle';\n        button.link(plugin, param);\n        targetEl.appendChild(button);\n        break;\n    }\n  }\n};\n\nMUI.removeChildren = function (targetId) {\n  var targetEl = document.getElementById(targetId);\n  while (targetEl.firstChild) {\n    targetEl.removeChild(targetEl.firstChild);\n  }\n};\n\nMUI.MouseResponder = function (senderID, targetElement, MUICallback) {\n  return new MouseResponder(senderID, targetElement, MUICallback);\n};\n\nMUI.KeyResponder = function (senderID, targetElement, MUICallback) {\n  return new KeyResponder(senderID, targetElement, MUICallback);\n};"
  },
  {
    "path": "examples/chorus/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Chorus | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>Chorus</h1>\n    <mui-rack id=\"rack\"></mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var sp1 = WX.SP1({ ampSustain: 1.0 });\n      var chorus = WX.Chorus();\n      sp1.to(chorus).to(WX.Master);\n\n      sp1.onReady = function () {\n        sp1.noteOn(60, 100);\n      };\n      sp1.loadClip({\n        name: 'guitar',\n        url: '../../sound/loops/cgtr-120-cmaj.mp3'\n      });\n\n      MUI.buildControls(chorus, 'rack');\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/cmp1/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>CMP1 | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>CMP1</h1>\n    <mui-rack id=\"rack\"></mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var sp1 = WX.SP1({ ampSustain: 1.0 });\n      var cmp1 = WX.CMP1({\n        output: 0.8, threshold: -50, ratio: 10, knee: 50,\n        attack: 0.02, release: 0.25, makeup: 6.28\n      });\n      sp1.to(cmp1).to(WX.Master);\n\n      sp1.onReady = function () {\n        sp1.noteOn(60, 100);\n      };\n      sp1.loadClip({\n        name: 'drums',\n        url: '../../sound/loops/drums.mp3'\n      });\n\n      MUI.buildControls(cmp1, 'rack');\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/converb/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>ConVerb | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>ConVerb</h1>\n    <mui-rack label=\"Reverb\" id=\"r-converb\">\n      <mui-select label=\"Preset\" id=\"preset\"></mui-select>\n    </mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var irData = [\n        {\n          key: 'Big Empty Church',\n          value: '../../sound/ir/960-BigEmptyChurch.mp3'\n        },\n        {\n          key: 'Reverse Gate',\n          value: '../../sound/ir/H3000-ReverseGate.mp3'\n        },\n        {\n          key: 'Brite Stage',\n          value: '../../sound/ir/960-BriteStage.mp3'\n        },\n        {\n          key: 'Elec SNR Plate',\n          value: '../../sound/ir/SPX990-ElecSNRPlate.mp3'\n        },\n        {\n          key: 'Large Bright Room',\n          value: '../../sound/ir/960-LargeBrightRoom.mp3'\n        },\n        {\n          key: 'Reflections',\n          value: '../../sound/ir/SPX990-Reflections.mp3'\n        },\n        {\n          key: 'Large Plate',\n          value: '../../sound/ir/960-LargePlate.mp3'\n        },\n        {\n          key: 'Acoustic Ambience',\n          value: '../../sound/ir/UAD140-AcousticAmbience.mp3'\n        },\n        {\n          key: 'Metal Verb',\n          value: '../../sound/ir/H3000-MetalVerb.mp3'\n        },\n        {\n          key: 'Master Plate',\n          value: '../../sound/ir/UAD140-MasterPlate.mp3'\n        }\n      ];\n\n      var impulse = WX.Impulse({ freq: 0.5 }),\n          converb = WX.ConVerb({ mix: 0.45 });\n      impulse.to(converb).to(WX.Master);\n\n      debugger;\n      converb.set('output', [[0.0], [1.0, 2, 1], [0.0, 3, 2]]);\n\n      // TODO: fix this...\n      var irClips = [], counter = irData.length;\n      for (var i = 0; i < irData.length; i++) {\n        var clip = {\n          name: irData[i].key,\n          url: irData[i].value,\n        };\n        irData[i].value = i;\n        WX.loadClip(clip, function () {\n          if (--counter === 0)\n            converb.setClip(irClips[0]);\n        });\n        irClips.push(clip);\n      }\n\n      MUI.buildControls(converb, 'r-converb');\n      MUI.$('preset').setModel(irData);\n      MUI.$('preset').setValue(irData[0].value);\n      MUI.$('preset').onItemSelected = function (value) {\n        converb.setClip(irClips[value]);\n      };\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/eq4/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>EQ4 | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>EQ4</h1>\n\n    <mui-rack label=\"EQ4\" opened=\"true\">\n      <mui-group label=\"Band 1\">\n        <mui-button id=\"b-band1-active\" type=\"toggle\"></mui-button>\n        <mui-select id=\"s-band1-type\" size=\"small\"></mui-select>\n        <mui-knob id=\"k-band1-freq\"></mui-knob>\n        <mui-knob id=\"k-band1-Q\"></mui-knob>\n        <mui-knob id=\"k-band1-gain\"></mui-knob>\n      </mui-group>\n      <mui-group label=\"Band 2\">\n        <mui-button id=\"b-band2-active\" type=\"toggle\"></mui-button>\n        <mui-select id=\"s-band2-type\" size=\"small\"></mui-select>\n        <mui-knob id=\"k-band2-freq\"></mui-knob>\n        <mui-knob id=\"k-band2-Q\"></mui-knob>\n        <mui-knob id=\"k-band2-gain\"></mui-knob>\n      </mui-group>\n      <mui-group label=\"Band 3\">\n        <mui-button id=\"b-band3-active\" type=\"toggle\"></mui-button>\n        <mui-select id=\"s-band3-type\" size=\"small\"></mui-select>\n        <mui-knob id=\"k-band3-freq\"></mui-knob>\n        <mui-knob id=\"k-band3-Q\"></mui-knob>\n        <mui-knob id=\"k-band3-gain\"></mui-knob>\n      </mui-group>\n      <mui-group label=\"Band 4\">\n        <mui-button id=\"b-band4-active\" type=\"toggle\"></mui-button>\n        <mui-select id=\"s-band4-type\" size=\"small\"></mui-select>\n        <mui-knob id=\"k-band4-freq\"></mui-knob>\n        <mui-knob id=\"k-band4-Q\"></mui-knob>\n        <mui-knob id=\"k-band4-gain\"></mui-knob>\n      </mui-group>\n    </mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var sp1 = WX.SP1({ ampSustain: 1.0 });\n      var eq4 = WX.EQ4();\n      sp1.to(eq4).to(WX.Master);\n\n      sp1.onReady = function () {\n        sp1.noteOn(60, 100);\n      };\n      sp1.loadClip({\n        name: 'guitar',\n        url: '../../sound/loops/cgtr-120-cmaj.mp3'\n      });\n\n      // MUI.buildControls(eq4, 'rack');\n\n      MUI.$('b-band1-active').link(eq4, 'band1Active');\n      MUI.$('s-band1-type').link(eq4, 'band1Type');\n      MUI.$('k-band1-freq').link(eq4, 'band1Freq');\n      MUI.$('k-band1-Q').link(eq4, 'band1Q');\n      MUI.$('k-band1-gain').link(eq4, 'band1Gain');\n      MUI.$('b-band2-active').link(eq4, 'band2Active');\n      MUI.$('s-band2-type').link(eq4, 'band2Type');\n      MUI.$('k-band2-freq').link(eq4, 'band2Freq');\n      MUI.$('k-band2-Q').link(eq4, 'band2Q');\n      MUI.$('k-band2-gain').link(eq4, 'band2Gain');\n      MUI.$('b-band3-active').link(eq4, 'band3Active');\n      MUI.$('s-band3-type').link(eq4, 'band3Type');\n      MUI.$('k-band3-freq').link(eq4, 'band3Freq');\n      MUI.$('k-band3-Q').link(eq4, 'band3Q');\n      MUI.$('k-band3-gain').link(eq4, 'band3Gain');\n      MUI.$('b-band4-active').link(eq4, 'band4Active');\n      MUI.$('s-band4-type').link(eq4, 'band4Type');\n      MUI.$('k-band4-freq').link(eq4, 'band4Freq');\n      MUI.$('k-band4-Q').link(eq4, 'band4Q');\n      MUI.$('k-band4-gain').link(eq4, 'band4Gain');\n\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/examples.js",
    "content": "var wxver = document.querySelector('#wx-version');\nwxver.textContent = WX.getVersion();"
  },
  {
    "path": "examples/fader/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Fader | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>Fader</h1>\n    <mui-rack label=\"Fader\" id=\"r-fader\"></mui-rack>\n\n  </div>\n\n  <script>\n\n    MUI.start(function () {\n\n      var osc = WX.SimpleOsc();\n      osc.to(WX.Master);\n      osc.noteOn(60, 32);\n      MUI.buildControls(WX.Master, 'r-fader');\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/filterbank/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>FilterBank | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>FilterBank</h1>\n    <mui-rack id=\"rack\"></mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var noise = WX.Noise({ output: 0.25 });\n      var fbank = WX.FilterBank();\n      var cverb = WX.ConVerb({ mix: 0.85 });\n      noise.to(fbank).to(cverb).to(WX.Master);\n\n      var clip = {\n        name: 'Big Empty Church',\n        url: '../../sound/ir/960-BigEmptyChurch.mp3'\n      };\n      WX.loadClip(clip, function () {\n        cverb.setClip(clip);\n      });\n\n      MUI.buildControls(fbank, 'rack');\n\n      var scaleModel = fbank.getScaleModel();\n\n      function step() {\n        fbank.set('pitch', WX.random2(12, 36));\n        fbank.set('scale', scaleModel[WX.random2(0, 3)].value);\n        setTimeout(step, 3000);\n      }\n\n      step();\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/fmk1/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>FMK1 | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>FMK1</h1>\n    <mui-rack id=\"r-params\"></mui-rack>\n    <mui-rack label=\"Effects\" opened=\"false\">\n      <mui-group id=\"g-delay\"></mui-group>\n      <mui-group id=\"g-verb\"></mui-group>\n    </mui-rack>\n    <mui-rack label=\"keyboard\">\n      <mui-vkey id=\"vkey\"></mui-vkey>\n    </mui-rack>\n\n  </div>\n\n  <script>\n    MUI.start(function () {\n\n      var fmk1 = WX.FMK1(),\n          delay = WX.StereoDelay({\n            mix: 1.0,\n            delayTimeLeft: 0.5,\n            delayTimeRight: 0.75,\n            feedbackLeft: 0.2,\n            feedbackRight: 0.4,\n            crosstalk: 0.25\n          }),\n          converb = WX.ConVerb({\n            mix: 1.0,\n            output: 0.5\n          });\n\n      converb.loadClip({\n        name: 'hall',\n        url: '../../sound/ir/960-LargePlate.mp3'\n      });\n\n      fmk1.to(WX.Master);\n      fmk1.to(delay).to(converb).to(WX.Master);\n\n      MUI.buildControls(fmk1, 'r-params');\n      MUI.buildControls(delay, 'g-delay');\n      MUI.buildControls(converb, 'g-verb');\n\n      MUI.$('vkey').addTarget(fmk1);\n\n    });\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/hellowaax/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Hello WAAX! | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n    <div>\n\n    <!-- example HTML code -->\n    <h1>Hello WAAX!</h1>\n    <mui-knob id=\"k-freq\"></mui-knob>\n    <mui-knob id=\"k-output\"></mui-knob>\n\n    </div>\n  </div>\n  <script>\n\n    // example JS code\n    MUI.start(function () {\n      var osc = WX.SimpleOsc();\n      osc.to(WX.Master);\n      osc.noteOn(60, 64);\n      MUI.$('k-freq').link(osc, 'oscFreq');\n      MUI.$('k-output').link(osc, 'output');\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/impulse/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Impulse | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>Impulse</h1>\n    <mui-rack id=\"rack\"></mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var impulse = WX.Impulse();\n      impulse.to(WX.Master);\n\n      MUI.buildControls(impulse, 'rack');\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Examples | WAAX</title>\n  <link rel=\"stylesheet\" href=\"style.css\">\n  <script src=\"../build/waax.min.js\"></script>\n</head>\n\n<body>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n    </div>\n\n    <div class=\"wx-toc\">\n      <h1>Examples</h1>\n\n      <h2 id=\"basics\">Basics</h2>\n      <dl>\n        <dt><a href=\"hellowaax\">Hello WAAX!</a></dt>\n        <dd>The first example.</dd>\n        <dt><a href=\"mui\">MUI Elements</a></dt>\n        <dd>Basic demonstration of MUI elements.</dd>\n        <dt><a href=\"workshop\">Plug-in Workshop</a></dt>\n        <dd>Interactive WAAX plug-in playground.</dd>\n      </dl>\n\n      <h2 id=\"plug-ins\">Plug-ins</h2>\n      <dl>\n        <dt><a href=\"chorus\">Chorus</a></dt>\n        <dd>Chorus effect based on Jon Dattorro's design.</dd>\n        <dt><a href=\"cmp1\">CMP1</a></dt>\n        <dd>Compressor based on Web Audio API native implementation.</dd>\n        <dt><a href=\"converb\">ConVerb</a></dt>\n        <dd>Convolution reverberator with easy control.</dd>\n        <dt><a href=\"eq4\">EQ4</a></dt>\n        <dd>4-band parametring equalizer.</dd>\n        <dt><a href=\"fader\">Fader</a></dt>\n        <dd>Channel fader support decibel control and stereo panning.</dd>\n        <dt><a href=\"filterbank\">FilterBank</a></dt>\n        <dd>Harmonized 8-band filterbank.</dd>\n        <dt><a href=\"fmk1\">FMK1</a></dt>\n        <dd>Single operator FM synth keys.</dd>\n        <dt><a href=\"impulse\">Impulse</a></dt>\n        <dd>Impulse train as an oscillator.</dd>\n        <dt><a href=\"noise\">Noise</a></dt>\n        <dd>Robust noise generator for white and pink noise.</dd>\n        <dt><a href=\"simpleosc\">SimpleOsc</a></dt>\n        <dd>Simple oscillator with vibrator and tremolo.</dd>\n        <dt><a href=\"sp1\">SP1</a></dt>\n        <dd>Single timbre/polyphonic sample player.</dd>\n        <dt><a href=\"stereodelay\">StereoDelay</a></dt>\n        <dd>Basic stereo delay for pingpong effect and more.</dd>\n        <dt><a href=\"wxs1\">WXS1</a></dt>\n        <dd>Monophonic dual oscillator subtractive synthesizer.</dd>\n      </dl>\n    </div>\n\n  </div>\n  <script src=\"examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/lab/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Lab | WAAX Examples</title>\n  <script src=\"../../bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <script src=\"../../build/waax.js\"></script>\n  <script src=\"../../build/plug_ins/simpleosc.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\"><a href=\"..\">Examples</a></span>\n    </div>\n    <h1>Lab</h1>\n\n    <!-- HTML here -->\n\n  </div>\n  <script>\n    MUI.start(function () {\n      // WAAX core here.\n    });\n  </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/mui/ex-mui-meter.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>MUI | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>MUI Elements</h1>\n\n    <mui-meter id=\"meter\"></mui-meter>\n\n  </div>\n  <script>\n    MUI.start(function () {\n      \n      var sp1 = WX.SP1({ ampSustain: 1.0 });\n      var meter = MUI.$('meter');\n      sp1.to(meter);\n\n      sp1.onReady = function () {\n        sp1.noteOn(60, 100);\n      };\n      sp1.loadClip({\n        name: 'drums',\n        url: '../../../sound/loops/drums.mp3'\n      });\n\n    });\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/mui/ex-mui-pianoroll.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>mui-pianoroll | Web Audio API eXtension</title>\n\n  <link rel=\"import\" href=\"../mui.html\">\n  <link rel=\"import\" href=\"../mui-style.html\">\n  <script src=\"../../build/waax.js\"></script>\n  <script src=\"../../build/plug_ins/wxs1.js\"></script>\n\n</head>\n\n<body unresolved>\n\n  <header>\n    <div class=\"row\">\n      <div class=\"small-10 small-centered columns\">\n        <ul class=\"breadcrumbs\">\n          <li><a href=\"..\">WAAX Home</a></li>\n        </ul>\n        <h3>MUI Elements <small>1.0.0-alpha</small></h3>\n      </div>\n    </div>\n  </header>\n\n  <article>\n    <div class=\"row\">\n      <div class=\"small-10 small-centered columns\">\n        <mui-rack id=\"r-synth\"></mui-rack>\n        <mui-rack label=\"Pianoroll\">\n          <mui-pianoroll id=\"proll\"></mui-pianoroll>\n        </mui-rack>\n        <mui-rack label=\"Transport\">\n          <mui-button id=\"b-rew\" icon=\"av:skip-previous\"></mui-button>\n          <mui-button id=\"b-pause\" icon=\"av:pause\"></mui-button>\n          <mui-button id=\"b-play\" icon=\"av:play-arrow\"></mui-button>\n        </mui-rack>\n      </div>\n    </div>\n  </article>\n\n  <script>\n    MUI.start(function () {\n\n      var wxs1 = WX.WXS1();\n      var notemap = WX.NoteMap();\n\n      for (var i = 0; i < 100; i++) {\n        notemap.push(WX.Note(60 + i, 100, 240 * i, 120));\n      }\n\n      MUI.$('proll').setNoteMap(notemap);\n\n      WX.Transport.addNoteMap(notemap);\n      WX.Transport.addView(MUI.$('proll'));\n      WX.Transport.addTarget(wxs1);\n\n      MUI.$('b-rew').onclick = WX.Transport.rewind.bind(WX.Transport);\n      MUI.$('b-pause').onclick = WX.Transport.pause.bind(WX.Transport);\n      MUI.$('b-play').onclick = WX.Transport.start.bind(WX.Transport);\n\n      MUI.buildControls(wxs1, 'r-synth');\n\n      wxs1.to(WX.Master);\n\n    });\n  </script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/mui/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>MUI | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>MUI Elements</h1>\n\n    <h2>mui-button</h2>\n    <mui-button icon=\"av:skip-previous\"></mui-button>\n    <mui-button icon=\"av:play-arrow\" type=\"toggle\"></mui-button>\n    <mui-button icon=\"av:pause\"></mui-button>\n    <mui-button icon=\"av:stop\"></mui-button>\n    <mui-button icon=\"av:loop\" type=\"toggle\"></mui-button>\n    <mui-button icon=\"work\"></mui-button>\n    <mui-button icon=\"social:person-add\"></mui-button>\n    <mui-button icon=\"social:share\"></mui-button>\n\n    <h2>mui-knob</h2>\n    <mui-knob label=\"knob 1\" value=\"0.3\"></mui-knob>\n    <mui-knob label=\"knob 2\" value=\"0.7\"></mui-knob>\n\n    <h2>mui-knobh</h2>\n    <mui-knobh label=\"BPM\" min=\"20\" max=\"200\" value=\"120\"></mui-knobh>\n    <mui-knobh label=\"Qunatize\" min=\"0\" max=\"100\" value=\"0\"></mui-knobh>\n\n    <h2>mui-select</h2>\n    <mui-select id=\"waveform\" label=\"items\"></mui-select>\n\n    <h2>mui-eblock</h2>\n    <mui-eblock></mui-eblock>\n\n    <h2>mui-rack | mui-group</h2>\n    <mui-rack label=\"rack\">\n      <mui-group label=\"group 1\">\n        <mui-knob label=\"knob 1\" value=\"0.1\"></mui-knob>\n        <mui-knob label=\"knob 2\" value=\"0.2\"></mui-knob>\n      </mui-group>\n      <mui-group label=\"group 2\">\n        <mui-knob label=\"knob 3\" value=\"0.3\"></mui-knob>\n        <mui-knob label=\"knob 4\" value=\"0.4\"></mui-knob>\n      </mui-group>\n    </mui-rack>\n\n    <h2>mui-vkey</h2>\n    <mui-rack label=\"keybaord\">\n      <mui-vkey id=\"vkey\"></mui-vkey>\n    </mui-rack>\n\n    <h2>mui-spectrum</h2>\n    <mui-rack label=\"spectrum\">\n      <mui-spectrum id=\"spec\"></mui-spectrum>\n    </mui-rack>\n\n    <h2>mui-pianoroll</h2>\n    <mui-rack label=\"workspace\">\n      <mui-pianoroll id=\"proll\"></mui-pianoroll>\n    </mui-rack>\n\n  </div>\n  <script>\n    MUI.start(function () {\n      // for mui-select to work\n      MUI.$('waveform').setModel(WX.WAVEFORMS);\n\n      // for mui-vkey, mui-spectrum to work\n      var osc = WX.SimpleOsc({ oscType: 'sawtooth',  lfoDepth: 200 });\n      var spec = MUI.$('spec');\n      osc.to(spec);\n      MUI.$('vkey').addTarget(osc);\n\n      // for mui-pianoroll to work\n      var noteclip = WX.NoteClip();\n      for (var i = 0; i < 24; i++) {\n        noteclip.push(WX.Note(48 + i, 100, 240 * i, 120));\n      }\n\n      MUI.$('proll').setNoteClip(noteclip);\n\n    });\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/mui/showcase.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>MUI | WAAX</title>\n  <script src=\"../../bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"deps.html\">\n</head>\n\n<body unresolved>\n\n  <div data-alert class=\"alert-box warning\">\n    <strong>NOTE</strong>: WAAX and MUI require <strong>Chrome</strong> because they are built on top of <strong>Web Audio API, Web MIDI API and Web Components</strong>. Check <a target=\"_blank\" href=\"http://caniuse.com\">CanIUse.com</a> for the browser support.\n    <a href=\"#\" class=\"close\">&times;</a>\n  </div>\n\n  <header>\n    <div class=\"row\">\n      <div class=\"small-10 small-centered columns\">\n        <ul class=\"breadcrumbs\">\n          <li><a href=\"..\">WAAX Home</a></li>\n        </ul>\n        <h3>MUI Elements Showcase</h3>\n      </div>\n    </div>\n  </header>\n\n  <article>\n    <div class=\"row\">\n      <div class=\"small-10 small-centered columns\">\n\n        <mui-rack label=\"WXS-1\" opened=\"true\">\n          <mui-group label=\"OSC1\">\n            <mui-select id=\"select-osc1type\"></mui-select>\n            <mui-knob id=\"knob-osc1octave\"></mui-knob>\n            <mui-knob id=\"knob-osc1gain\"></mui-knob>\n          </mui-group>\n          <mui-group label=\"OSC2\">\n            <mui-select id=\"select-osc2type\"></mui-select>\n            <mui-knob id=\"knob-osc2detune\"></mui-knob>\n            <mui-knob id=\"knob-osc2gain\"></mui-knob>\n          </mui-group>\n          <mui-group label=\"Master\">\n            <mui-knob id=\"knob-output\"></mui-knob>\n          </mui-group>\n          <mui-group label=\"Filter\">\n            <mui-knob id=\"knob-cutoff\"></mui-knob>\n            <mui-knob id=\"knob-reso\"></mui-knob>\n            <mui-knob id=\"knob-filterMod\"></mui-knob>\n          </mui-group>\n          <mui-group label=\"Filter Envelope\">\n            <mui-knob id=\"knob-filterA\"></mui-knob>\n            <mui-knob id=\"knob-filterD\"></mui-knob>\n            <mui-knob id=\"knob-filterS\"></mui-knob>\n            <mui-knob id=\"knob-filterR\"></mui-knob>\n          </mui-group>\n          <mui-group label=\"Amp Envelope\">\n            <mui-knob id=\"knob-ampA\"></mui-knob>\n            <mui-knob id=\"knob-ampD\"></mui-knob>\n            <mui-knob id=\"knob-ampS\"></mui-knob>\n            <mui-knob id=\"knob-ampR\"></mui-knob>\n          </mui-group>\n        </mui-rack>\n\n        <mui-rack label=\"Keyboard\" opened=\"true\">\n          <mui-vkey id=\"vkey\"></mui-vkey>\n        </mui-rack>\n\n        <mui-rack label=\"Control\" opened=\"true\">\n          <mui-group label=\"Transport\">\n            <mui-button icon=\"av:skip-previous\"></mui-button>\n            <mui-button icon=\"av:stop\"></mui-button>\n            <mui-button icon=\"av:pause\"></mui-button>\n            <mui-button icon=\"av:play-arrow\" type=\"toggle\"></mui-button>\n            <mui-button icon=\"av:loop\" type=\"toggle\"></mui-button>\n          </mui-group>\n          <mui-group label=\"Collaboration\">\n            <mui-button icon=\"work\"></mui-button>\n            <mui-button icon=\"social:person-add\"></mui-button>\n            <mui-button icon=\"social:share\"></mui-button>\n          </mui-group>\n          <mui-group label=\"Tempo\">\n            <mui-knobh id=\"knob-tempo\" label=\"BPM\" min=\"20\" max=\"200\" value=\"120\"></mui-knobh>\n            <mui-knobh id=\"knob-quant\" label=\"Qunatize\" min=\"0\" max=\"100\" value=\"0\"></mui-knobh>\n            <mui-knobh id=\"knob-swing\" label=\"Swing\" min=\"0\" max=\"100\" value=\"0\"></mui-knobh>\n          </mui-group>\n        </mui-rack>\n\n      </div>\n    </div>\n  </article>\n\n  <script>\n    MUI.start(function () {\n      var wxs1 = WX.WXS1();\n      wxs1.to(WX.Master);\n      MUI.$('select-osc1type').link(wxs1, 'osc1type');\n      MUI.$('knob-osc1octave').link(wxs1, 'osc1octave');\n      MUI.$('knob-osc1gain').link(wxs1, 'osc1gain');\n      MUI.$('select-osc2type').link(wxs1, 'osc2type');\n      MUI.$('knob-osc2detune').link(wxs1, 'osc2detune');\n      MUI.$('knob-osc2gain').link(wxs1, 'osc2gain');\n      MUI.$('knob-output').link(wxs1, 'output');\n      MUI.$('knob-cutoff').link(wxs1, 'cutoff');\n      MUI.$('knob-reso').link(wxs1, 'reso');\n      MUI.$('knob-filterMod').link(wxs1, 'filterMod');\n      MUI.$('knob-filterA').link(wxs1, 'filterAttack');\n      MUI.$('knob-filterD').link(wxs1, 'filterDecay');\n      MUI.$('knob-filterS').link(wxs1, 'filterSustain');\n      MUI.$('knob-filterR').link(wxs1, 'filterRelease');\n      MUI.$('knob-ampA').link(wxs1, 'ampAttack');\n      MUI.$('knob-ampD').link(wxs1, 'ampDecay');\n      MUI.$('knob-ampS').link(wxs1, 'ampSustain');\n      MUI.$('knob-ampR').link(wxs1, 'ampRelease');\n      MUI.$('vkey').addTarget(wxs1);\n    });\n  </script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/noise/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>CMP1 | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>Noise</h1>\n    <mui-rack label=\"Noise\" id=\"rack\"></mui-rack>\n    <mui-rack label=\"Spectrum\">\n      <mui-spectrum id=\"spec\"></mui-spectrum>\n    </mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var noise = WX.Noise({ output: 0.25 });\n      noise.to(WX.Master);\n\n      MUI.buildControls(noise, 'rack');\n      noise.to(MUI.$('spec'));\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "examples/simpleosc/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>CMP1 | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>SimpleOsc</h1>\n    <mui-rack id=\"rack\"></mui-rack>\n    <mui-rack label=\"Spectrum\">\n      <mui-spectrum id=\"spec\"></mui-spectrum>\n    </mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var osc = WX.SimpleOsc();\n      osc.to(WX.Master);\n\n      osc.to(MUI.$('spec'));\n      MUI.buildControls(osc, 'rack');\n\n      osc.noteOn(64, 100);\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/sp1/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n<title>SP1 | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>SP1</h1>\n    <mui-rack id=\"rack\"></mui-rack>\n    <mui-rack label=\"Keyboard\">\n      <mui-vkey id=\"vkey\"></mui-vkey>\n    </mui-rack>\n\n  </div>\n  <script>\n\n    MUI.start(function () {\n\n      var sp1 = WX.SP1({ ampSustain: 1.0 });\n      sp1.to(WX.Master);\n\n      sp1.loadClip({\n        name: 'Guitar 120BPM CMaj',\n        url: '../../sound/loops/cgtr-120-cmaj.mp3'\n      });\n\n      MUI.buildControls(sp1, 'rack');\n      MUI.$('vkey').addTarget(sp1);\n\n    });\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/stereodelay/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>StereoDelay | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n      <h1>StereoDelay</h1>\n      <mui-rack id=\"rack\"></mui-rack>\n\n    </div>\n  <script>\n\n    MUI.start(function () {\n\n      var impuse = WX.Impulse(),\n          delay = WX.StereoDelay();\n      impuse.to(delay).to(WX.Master);\n\n      MUI.buildControls(delay, 'rack');\n\n    });\n\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/style.css",
    "content": "body {\n  font-family: \"Roboto Condensed\";\n  color: #37474F;\n}\n\nh1 {\n  font-size: 2.4rem;\n  margin: 2rem 0 1rem 0;\n}\n\nh2 {\n  font-size: 2.0rem;\n  margin: 1.8rem 0 0 0;\n}\n\n.wx-container {\n  width: 800px;\n  margin: 40px 20px;\n}\n\n.wx-header {\n  padding-bottom: 0.25rem;\n  border-bottom: 1px solid #607D8B;\n}\n\n.wx-title {\n  font-size: 1.2rem;\n  font-weight: 400;\n  letter-spacing: 0.25rem;\n}\n\n.wx-info {\n  color:#B0BEC5;\n  font-size: 0.75rem;\n  font-weight: 300;\n}\n\n.wx-menu {\n  font-size: 1.0rem;\n  font-weight: 300;\n  display: inline-block;\n  float: right;\n  line-height: 30px;\n}\n\n.wx-menu a:hover {\n  color: #0277BD;\n}\n\n.wx-menu a {\n  color: #03A9F4;\n  text-decoration: none;\n}\n\n.wx-toc dl {\n  margin-left: 0.75rem;\n}\n\n.wx-toc dt {\n  font-size: 1.4rem;\n  font-weight: 300;\n  margin-bottom: 0.125rem;\n}\n\n.wx-toc dd {\n  color: #546E7A;\n  font-family: \"Roboto\";\n  font-size: 0.925rem;\n  margin: 0 0 1.2rem 0;\n}\n\n.wx-toc a,\n.wx-toc a:visited,\n.wx-toc a:active {\n  color: #03A9F4;\n  text-decoration: none;\n}\n\n.wx-toc a:hover {\n  color: #0277BD;\n  text-decoration: underline;\n}\n\n\nh2 {\n  margin: 2.5rem 0 0.5rem 0;\n  padding: 0;\n}"
  },
  {
    "path": "examples/workshop/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Plug-in Workshop | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>Plug-in Workshop</h1>\n\n    <mui-select label=\"Generator\" id=\"select-gen\"></mui-select>\n    <mui-rack id=\"params-gen\" title=\"Generator\" opened=\"true\">\n    </mui-rack>\n\n    <mui-select label=\"Processor\" id=\"select-pro\"></mui-select>\n    <mui-rack id=\"params-pro\" title=\"Processor\" opened=\"true\">\n    </mui-rack>\n\n    <mui-rack label=\"Keyboard\" opened=\"false\">\n      <mui-vkey id=\"vkey\"></mui-vkey>\n    </mui-rack>\n\n    <mui-rack label=\"spectrum\">\n      <mui-spectrum id=\"spec\"></mui-spectrum>\n    </mui-rack>\n  </div>\n\n\n  <script>\n    MUI.start(function () {\n\n      // Get registered WX plug-ins: Generator and Processor\n      var gens = WX.PlugIn.getRegistered('Generator'),\n          pros = WX.PlugIn.getRegistered('Processor');\n\n      // Create data model for mui-select\n      var genModel = [],\n          proModel = [];\n      for (var i = 0; i < gens.length; i++) {\n        genModel.push({ key: gens[i], value: gens[i] });\n      }\n      for (i = 0; i < pros.length; i++) {\n        proModel.push({ key: pros[i], value: pros[i] });\n      }\n\n      // Get DOM handles with MUI.$ selector\n      var genSelector = MUI.$('select-gen'),\n          proSelector = MUI.$('select-pro'),\n          vkeySelector = MUI.$('vkey'),\n          specSelector = MUI.$('spec');\n\n      // Set data model and event handler\n      genSelector.setModel(genModel);\n      genSelector.setValue(gens[0]);\n      genSelector.onItemSelected = onPatch;\n      proSelector.setModel(proModel);\n      proSelector.setValue(pros[1]);\n      proSelector.onItemSelected = onPatch;\n\n      // loading WXClip for convolution reverb and SP1\n      var reverbClip = {\n        name: '960 Large Plate',\n        url: '../../sound/ir/960-LargePlate.mp3'\n      };\n      var sp1Clip = {\n        name: 'Guitar 120BPM CMaj',\n        url: '../../sound/loops/cgtr-120-cmaj.mp3'\n      };\n\n      WX.loadClip(reverbClip, function (clip) {\n        WX.Log.info('clip loaded.');\n      });\n      WX.loadClip(sp1Clip, function (clip) {\n        WX.Log.info('clip loaded.');\n      });\n\n      // Current generator and processor references\n      var currGen, currPro;\n\n      // Event handler: onPatch\n      function onPatch() {\n\n        // clear up\n        if (currGen) {\n          currGen.cut();\n          vkeySelector.removeTarget(currGen);\n        }\n        if (currPro) {\n          currPro.cut();\n        }\n        MUI.removeChildren('params-gen');\n        MUI.removeChildren('params-pro');\n\n        // recreation\n        currGen = WX[genSelector.value]();\n        currPro = WX[proSelector.value]();\n        currGen.to(currPro).to(WX.Master);\n        currPro.to(specSelector);\n\n        // connecting keyboard input\n        if (currGen.onData) {\n          vkeySelector.addTarget(currGen);\n        }\n\n        if (genSelector.value === 'SP1') {\n          currGen.setClip(sp1Clip);\n        }\n\n        // parse and build GUI elements\n        MUI.buildControls(currGen, 'params-gen');\n        MUI.buildControls(currPro, 'params-pro');\n\n        if (proSelector.value === 'ConVerb') {\n          currPro.setClip(reverbClip);\n        }\n\n      }\n\n      // Initial patching\n      onPatch();\n\n    });\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/wxs1/index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>WXS1 | WAAX Examples</title>\n  <script src=\"../../build/waax.min.js\"></script>\n  <script src=\"../../build/mui/bower_components/webcomponentsjs/webcomponents.min.js\"></script>\n  <link rel=\"import\" href=\"../../build/mui/mui.html\">\n  <link rel=\"stylesheet\" href=\"../style.css\">\n</head>\n\n<body unresolved>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n      <span class=\"wx-menu\">\n        <a href=\"..\">Examples</a>\n      </span>\n    </div>\n\n    <h1>WXS1</h1>\n    <mui-rack id=\"rack\"></mui-rack>\n    <mui-rack label=\"Keyboard\">\n      <mui-vkey id=\"vkey\"></mui-vkey>\n    </mui-rack>\n\n  </div>\n  <script>\n    MUI.start(function () {\n      var synth = WX.WXS1();\n      synth.to(WX.Master);\n      MUI.buildControls(synth, 'rack');\n      MUI.$('vkey').addTarget(synth);\n    });\n  </script>\n  <script src=\"../examples.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "gulpfile.js",
    "content": "/**\n * WAAX project gulp task file (1.0.0-alpha3)\n *\n * gulp                    # build everything and serve at 127.0.0.1:3000\n * gulp clean              # cleans dist, build path\n * gulp core               # minifies and concats core JS files to build/\n * gulp plugins            # minifies plug-in JS files to build/plug_ins\n * gulp mui                # copies MUI elements files to build/\n * gulp serve              # starts dev server 127.0.0.1:3000 and opens Chrome\n * gulp build              # build and minify core, plug-ins\n */\n\nvar gulp        = require('gulp'),\n    plugins     = require('gulp-load-plugins')(),\n    browserSync = require('browser-sync'),\n    runSequence = require('run-sequence'),\n    del         = require('del');\n\nvar wrap        = require('gulp-wrap');\n\nvar reload      = browserSync.reload;\n\n\nvar WX_CORE = [\n  'src/waax.js',\n  'src/waax.extension.js',\n  'src/waax.util.js',\n  'src/waax.core.js',\n  'src/waax.timebase.js',\n  'src/mui/mui.js'\n];\n\nvar WX_PLUGINS = [\n  'src/plug_ins/**/*.js'\n];\n  \n\n// Clean: Empty the build directory before a complete build.\ngulp.task('clean', del.bind(null, [\n  'build/**/*',\n  '!build'\n]));\n\n\n// Everything: Build core and plug-ins.\ngulp.task('core', function () {\n  return gulp.src(WX_CORE)\n    .pipe(plugins.uglify({ mangle: false }))\n    .pipe(plugins.concat('waaxcore.min.js'))\n    .pipe(wrap('(function () {\\n\"use strict\";\\n<%= contents %>\\n})();'))\n    .pipe(gulp.dest('build'))\n    .pipe(plugins.size({ title: 'core' }));\n});\n\ngulp.task('plugins', function () {\n  return gulp.src(WX_PLUGINS)\n    .pipe(plugins.uglify({ mangle: false }))\n    .pipe(plugins.concat('plugins.min.js'))\n    .pipe(gulp.dest('build'))\n    .pipe(plugins.size({ title: 'plugins' }));\n});\n\ngulp.task('everything', ['core', 'plugins'], function () {\n  gulp.src(['build/waaxcore.min.js', 'build/plugins.min.js'])\n    .pipe(plugins.concat('waax.min.js'))\n    .pipe(gulp.dest('build'))\n    .pipe(plugins.size({ title: 'everything' }));\n});\n\n\n// MUI: Build MUI elements into build/mui/ path.\ngulp.task('mui', function () {\n  return gulp.src([\n    'src/mui/**/*',\n    '!src/mui/bower.json'\n  ])\n    .pipe(gulp.dest('build/mui'))\n    .pipe(plugins.size({ title: 'mui' }));\n});\n\n\n// Serve: Start a dev server at 127.0.0.1:3000.\ngulp.task('serve', function () {\n  browserSync({\n    notify: false,\n    server: {\n      baseDir: './'\n    },\n    browser: 'google chrome'\n    // browser: 'google chrome canary'\n  });\n\n  gulp.watch(['src/*.js', '!src/ktrl.js'], ['everything', reload]);\n  gulp.watch(['src/plug_ins/**/*.js'], ['everything', reload]);\n  gulp.watch(['src/mui/**/*.html'], ['mui', reload]);\n  gulp.watch(['examples/**/*'], reload);\n  gulp.watch(['test/**/*.html', 'test/**/*.js'], reload);\n});\n\n\n// Build: Clean and build everything in build/ path.\ngulp.task('build', function (cb) {\n  runSequence('clean', ['everything', 'mui'], cb);\n});\n\n\n// Default: Build and serve.\ngulp.task('default', function (cb) {\n  runSequence('build', 'serve', cb);\n});"
  },
  {
    "path": "index.html",
    "content": "<!doctype html>\n<html>\n\n<head>\n  <title>Index | WAAX</title>\n  <link rel=\"stylesheet\" href=\"examples/style.css\">\n  <script src=\"build/waax.min.js\"></script>\n</head>\n\n<body>\n  <div class=\"wx-container\">\n    <div class=\"wx-header\">\n      <span class=\"wx-title\">WAAX</span>\n      <span class=\"wx-info\" id=\"wx-version\"></span>\n    </div>\n\n    <div class=\"wx-toc\">\n      <h1>Index</h1>\n\n      <dl>\n        <dt><a href=\"examples\">Examples</a></dt>\n        <dd>Various examples written with WAAX</dd>\n        <dt><a href=\"test\">WAAX Client Test</a></dt>\n        <dd>Mocha/Chai in-browser testing.</dd>\n        <dt><a href=\"http://hoch.github.io/WAAX/\">WAAX Project Landing Page</a></dt>\n        <dd>Project landing page. (gh-pages branch on GitHub)</dd>\n        <dt><a href=\"https://github.com/hoch/WAAX\">WAAX Project GitHub Repository</a></dt>\n        <dd>Project repository on GitHub.</dd>\n        <dt><a href=\"https://github.com/hoch/WAAX/issues\">GitHub Issue Tracker</a></dt>\n        <dd>Project issue tracker on GitHub.</dd>\n        <dt><a href=\"http://hoch.io/\">Hongchan's Blog</a></dt>\n        <dd>Author's blog and other projects.</dd>\n      </dl>\n\n      </dl>\n    </div>\n\n  </div>\n  <script src=\"examples/examples.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"WAAX\",\n  \"version\": \"1.0.0-alpha3\",\n  \"description\": \"Web Audio API extenstion. JavaScript web music framework built on top of Web Audio API and WebComponents/Polymer.\",\n  \"author\": \"Hongchan Choi <hongchan.choi@gmail.com>\",\n  \"devDependencies\": {\n    \"browser-sync\": \"~1.8.2\",\n    \"chai\": \"^1.10.0\",\n    \"del\": \"~1.1.1\",\n    \"gulp\": \"~3.8.10\",\n    \"gulp-concat\": \"~2.4.3\",\n    \"gulp-flatten\": \"~0.0.4\",\n    \"gulp-load-plugins\": \"~0.8.0\",\n    \"gulp-size\": \"~1.1.0\",\n    \"gulp-uglify\": \"~1.0.2\",\n    \"gulp-wrap\": \"0.11.0\",\n    \"mocha\": \"~2.1.0\",\n    \"run-sequence\": \"~1.0.2\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/hoch/WAAX.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/hoch/WAAX/issues\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "sound/LICENSE",
    "content": "LICENSE\n=======\n\n\nHochKit Drum Samples ('hochkit/')\n---------------------------------\n: Drum samples made by myself. (CC BY-NC 3.0).\n  - fx-001.mp3\n  - fx-002.mp3\n  - hh-001.mp3\n  - hh-002.mp3\n  - hh-003.mp3\n  - hh-004.mp3\n  - kd-001.mp3\n  - kd-002.mp3\n  - kd-003.mp3\n  - kd-004.mp3\n  - kd-005.mp3\n  - kd-006.mp3\n  - kd-007.mp3\n  - kd-008.mp3\n  - kd-009.mp3\n  - kd-010.mp3\n  - kd-011.mp3\n  - kd-012.mp3\n  - oh-001.mp3\n  - oh-002.mp3\n  - oh-003.mp3\n  - perc-001.mp3\n  - perc-002.mp3\n  - perc-003.mp3\n  - perc-004.mp3\n  - perc-005.mp3\n  - sd-001.mp3\n  - sd-002.mp3\n  - sd-003.mp3\n  - sd-004.mp3\n  - sd-005.mp3\n  - sd-006.mp3\n  - sd-007.mp3\n  - sd-008.mp3\n  - sd-009.mp3\n  - sd-010.mp3\n  - sd-011.mp3\n  - sd-012.mp3\n\n\nImpulse Responses ('ir/')\n-------------------------\n: Selectively choosen IRs from Echochamber.ch (no license info)\n: http://www.echochamber.ch/index.php/tipps-freebies/impulseresponses.html\n  - 960-BigEmptyChurch.mp3\n  - 960-BriteStage.mp3\n  - 960-LargeBrightRoom.mp3\n  - 960-LargePlate.mp3\n  - H3000-MetalVerb.mp3\n  - H3000-ReverseGate.mp3\n  - SPX990-ElecSNRPlate.mp3\n  - SPX990-Reflections.mp3\n  - UAD140-AcousticAmbience.mp3\n  - UAD140-MasterPlate.mp3\n\n\nLoops ('loops/')\n----------------\n: Strever's Rhythmguitar Loops Pack 1 by Strever953 (CC 0)\n: https://www.freesound.org/people/Strever953/packs/9201/\n  - cgtr-120-cmaj.mp3\n  - cgtr-120-dmin.mp3\n  - cgtr-120-gmaj.mp3"
  },
  {
    "path": "src/ktrl.js",
    "content": "/*\n  Copyright 2013, Google Inc.\n  All rights reserved.\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are\n  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\n  copyright notice, this list of conditions and the following disclaimer\n  in the documentation and/or other materials provided with the\n  distribution.\n      * Neither the name of Google Inc. nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * safety check first\n */\n(function() {\n  if (typeof navigator.requestMIDIAccess === \"undefined\") {\n    throw new Error(\"[Ktrl] your browser does not support Web MIDI API. Halt.\");\n  }\n})();\n\n/**\n * @namespace Ktrl\n * @version r1\n * @author Hongchan Choi (hoch, hongchan@google.com)\n */\nwindow.Ktrl = (function() {\n\n  // available MIDI sources (inputs) and targets (outputs)\n  var sources = [];\n  var targets = [];\n  // target ID counter\n  var targetId = 0;\n\n  // on ready event function\n  var onready = null;\n  // system-ready flag\n  var status = false;\n  // version\n  var version = \"r1\";\n\n  /**\n   * @class [internal] MIDI source (input port abstraction)\n   * @param {MIDIInput} midiinput MIDI input from MIDIAccess instance\n   */\n  function MIDISource (midiinput) {\n    this.input = midiinput;\n    this.targets = [];\n    var me = this;\n    this.input.onmidimessage = function (e) {\n      var c = me.targets.length;\n      while (c--) {\n        me.targets[c].ondata(e);\n      }\n    };\n  }\n\n  // class MIDISource prototype\n  MIDISource.prototype = {\n\n    constructor: MIDISource,\n\n    /**\n     * removes a target from the source\n     * @param {object} target target object to be removed\n     */\n    removeTarget: function (target) {\n      // traverse array looking for the target and remove when found\n      var me = this;\n      this.targets.map(function (t) {\n        if (t === target) {\n          var idx = me.targets.indexOf(target);\n          me.targets.splice(idx, 1);\n        }\n      });\n    },\n\n    /**\n     * adds a target to this source (creating a connection)\n     * @param {object} target target object to be added\n     */\n    addTarget: function (target) {\n      // if target already exists, ignore\n      for(var i = 0; i < this.targets.length; ++i) {\n        if (this.targets[i] === target) {\n          post(\"duplicate target.\");\n          return;\n        }\n      }\n      this.targets.push(target);\n    }\n\n  };\n\n  /**\n   * @class [internal] MIDI target (MIDI receiving end abstraction)\n   */\n  function MIDITarget (label) {\n    this.id = targetId++;\n    this.label = label || \"Untitled\";\n    this.active = false;\n    this.process = function () {};\n    var me = this;\n    this.ondata = function(e) {\n      if (me.active) {\n        me.process(e);\n      }\n    };\n    targets.push(this);\n  }\n\n  // class MIDItarget prototype\n  MIDITarget.prototype = {\n\n    constructor: MIDITarget,\n\n    /**\n     * defines message handler for \"on data\" event\n     * @param {function} fn MIDI data handler\n     */\n    onData: function (fn) {\n      this.process = fn;\n    },\n\n    /**\n     * activates the incoming data processing\n     */\n    activate: function () {\n      this.active = true;\n    },\n\n    /**\n     * disables the incoming data processing\n     */\n    disable: function () {\n      this.active = false;\n    },\n\n    /**\n     * get target's ID number\n     * @return {int} unique target ID\n     */\n    getID: function () {\n      return this.id;\n    }\n\n  };\n\n  /**\n   * [helper, factory] creates a new MIDI target\n   * @return {object} MIDI target object\n   */\n  function createTarget (label) {\n    return new MIDITarget(label);\n  }\n\n  /**\n   * routes all sources to a target\n   * @param  {object} target MIDI target\n   * @return {boolean} result\n   */\n  function routeAllToTarget (target) {\n    // NOTE: this won't work after closure compilation\n    // if (target.constructor.name !== \"MIDITarget\") {\n    //   post(\"invalid argument. (must use MIDITarget)\");\n    //   return false;\n    // }\n    // connect all sources to the target\n    sources.map(function (s) {\n      s.addTarget(target);\n    });\n    return true;\n  }\n\n  /**\n   * routes a specific source to a target\n   * @param  {int} sourceId MIDI source ID (see Ktrl.report() for available ID)\n   * @param  {object} target MIDI target\n   * @return {boolean} result\n   */\n  function routeSourceToTarget (sourceId, target) {\n    // check id first\n    if (sourceId < sources.length) {\n      // remove target from all sources\n      sources.map(function (s) {\n        s.removeTarget(target);\n      });\n      // connect a source to target\n      sources[sourceId].addTarget(target);\n      return true;\n    } else {\n      post(\"invalid source id or target.\");\n      return false;\n    }\n  }\n\n  /**\n   * disconnect a target from all sources (while not removing)\n   * @param  {MIDITarget} target a target to be disconnected\n   * @return {boolean} result\n   */\n  function disconnectTarget (target) {\n    // NOTE: this won't work after closure compilation\n    // if (target.constructor.name !== \"MIDITarget\") {\n    //   post(\"invalid argument. (must use MIDITarget)\");\n    //   return false;\n    // }\n    sources.map(function (s) {\n      s.removeTarget(target);\n    });\n    return true;\n  }\n\n  /**\n   * disconnect and remove a target from the system\n   * @param  {MIDITarget} target a target to be disconnected\n   * @return {boolean} result\n   */\n  function removeTarget (target) {\n    // disconnect first\n    if (Ktrl.disconnectTarget(target)) {\n      // remove target from system wide target pool\n      targets.map(function (t) {\n        if (t === target) {\n          var idx = targets.indexOf(target);\n          targets.splice(idx, 1);\n        }\n      });\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  /**\n   * [helper] defines onReady function\n   * @param {function} fn user-defined function\n   */\n  function ready (fn) {\n    if (typeof fn !== 'function') {\n      post(\"invalid handler function.\");\n    } else {\n      onready = fn;\n    }\n  }\n\n  /**\n   * [helper] reports available input ports\n   */\n  function report () {\n    var counter = 0;\n    post(\"listing available MIDI Input Ports...\");\n    sources.map(function (s) {\n      console.log(s.input.type, counter++, \"\\t\", s.input.name, \"\\t\", s.input.manufacturer);\n    });\n    post(\"listing available MIDI targets...\");\n    targets.map(function (t) {\n      console.log(\"id \" + t.id, \"\\t\", t.label, \"\\t\", t.active);\n    });\n  }\n\n  /**\n   * [helper] post message with the library tag\n   * @param  {string} msg log message\n   */\n  function post (msg) {\n    console.log(\"[ktrl] \" + msg);\n  }\n\n  /**\n   * [helper] parses MIDI message\n   * @param  {array} midimsg 3-bytes MIDI message\n   * @return {object} parsed MIDI message (see below for property names)\n   *\n   * [\"noteoff\", \"noteon\"]: { type, channel, pitch, velocity }\n   * [\"polypressure\"]: { type, channel, pitch, pressure }\n   * [\"controlchange\"]: { type, channel, control, value }\n   * [\"programchange\"]: { type, channel, program }\n   * [\"channelpressure\"]: { type, channel, pressure }\n   * [\"pitchwheel\"]: { type, channel, wheel }\n   */\n  parse = function (midimsg) {\n    var data = midimsg.data;\n    var type = data[0] >> 4;\n    var channel = (data[0] & 0x0F) + 1;\n    var parsedData;\n    switch (type) {\n      case 8:\n        parsedData = {\n          type: \"noteoff\",\n          channel: channel,\n          pitch: data[1],\n          velocity: data[2]\n        };\n        break;\n      case 9:\n        parsedData = {\n          type: \"noteon\",\n          channel: channel,\n          pitch: data[1],\n          velocity: data[2]\n        };\n        break;\n      case 10:\n        parsedData = {\n          type: \"polypressure\",\n          channel: channel,\n          pitch: data[1],\n          pressure: data[2]\n        };\n        break;\n      case 11:\n        parsedData = {\n          type: \"controlchange\",\n          channel: channel,\n          control: data[1],\n          value: data[2]\n        };\n        break;\n      case 12:\n        parsedData = {\n          type: \"programchange\",\n          channel: channel,\n          program: data[1]\n        };\n        break;\n      case 13:\n        parsedData = {\n          type: \"channelpressure\",\n          channel: channel,\n          pressure: data[1]\n        };\n        break;\n      case 14:\n        parsedData = {\n          type: \"pitchwheel\",\n          channel: channel,\n          wheel: (data[1] << 8 | data[2])\n        };\n        break;\n    }\n    return parsedData;\n  };\n\n  // ENTRY POINT: scan input port and boot up\n  navigator.requestMIDIAccess().then(function (midiAccess) {\n    // check input ports\n    if (midiAccess.inputs().length === 0) {\n      post(\"no input ports available\");\n      return;\n    }\n    // creating MIDI sources\n    for(var i = 0; i < midiAccess.inputs().length; ++i) {\n      sources[i] = new MIDISource(midiAccess.inputs()[i]);\n    }\n    post(\"Ktrl (\" + version + \") is ready.\");\n    status = true;\n    if (typeof onready === 'function') {\n      onready();\n    } else {\n      post(\"onReady is not specified.\");\n    }\n  }, function (msg) {\n    post(\"failed to get MIDI access: \" + msg);\n    status = false;\n    return;\n  });\n\n  // exposes handles\n  return {\n    createTarget: createTarget,\n    removeTarget: removeTarget,\n    disconnectTarget: disconnectTarget,\n    routeAllToTarget: routeAllToTarget,\n    routeSourceToTarget: routeSourceToTarget,\n    ready: ready,\n    parse: parse,\n    report: report\n  };\n\n})();"
  },
  {
    "path": "src/mui/bower.json",
    "content": "{\n  \"name\": \"MUI\",\n  \"version\": \"1.0.0-alpha3\",\n  \"homepage\": \"https://github.com/hoch/WAAX\",\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"bower_components\"\n  ],\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#~0.5.1\",\n    \"core-icon\": \"Polymer/core-icon#~0.5.2\"\n  }\n}"
  },
  {
    "path": "src/mui/bower_components/core-component-page/.bower.json",
    "content": "{\n  \"name\": \"core-component-page\",\n  \"private\": true,\n  \"dependencies\": {\n    \"webcomponentsjs\": \"Polymer/webcomponentsjs#^0.5.0\",\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\",\n  \"homepage\": \"https://github.com/Polymer/core-component-page\",\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"443d8dcbcb1b203ed88c6af64c98f76e6434ba53\"\n  },\n  \"_source\": \"git://github.com/Polymer/core-component-page.git\",\n  \"_target\": \"^0.5.0\",\n  \"_originalSource\": \"Polymer/core-component-page\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-component-page/README.md",
    "content": "core-component-page\n===================\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-component-page) for more information.\n\nNote: this is the vulcanized version of [`core-component-page-dev`](https://github.com/Polymer/core-component-page-dev) (the source).\n"
  },
  {
    "path": "src/mui/bower_components/core-component-page/bower.json",
    "content": "{\n  \"name\": \"core-component-page\",\n  \"private\": true,\n  \"dependencies\": {\n    \"webcomponentsjs\": \"Polymer/webcomponentsjs#^0.5.0\",\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-component-page/core-component-page.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<style>body{margin:0}</style>\n\n<div hidden><link rel=\"import\" href=\"../polymer/polymer.html\"><polymer-element name=\"core-meta\" attributes=\"label type\" hidden assetpath=\"../core-meta/\"><script>(function(){var SKIP_ID=\"meta\";var metaData={},metaArray={};Polymer(\"core-meta\",{type:\"default\",alwaysPrepare:true,ready:function(){this.register(this.id)},get metaArray(){var t=this.type;if(!metaArray[t]){metaArray[t]=[]}return metaArray[t]},get metaData(){var t=this.type;if(!metaData[t]){metaData[t]={}}return metaData[t]},register:function(id,old){if(id&&id!==SKIP_ID){this.unregister(this,old);this.metaData[id]=this;this.metaArray.push(this)}},unregister:function(meta,id){delete this.metaData[id||meta.id];var i=this.metaArray.indexOf(meta);if(i>=0){this.metaArray.splice(i,1)}},get list(){return this.metaArray},byId:function(id){return this.metaData[id]}})})();</script></polymer-element><polymer-element name=\"core-iconset\" extends=\"core-meta\" attributes=\"src width icons iconSize\" assetpath=\"../core-iconset/\"><script>Polymer(\"core-iconset\",{src:\"\",width:0,icons:\"\",iconSize:24,offsetX:0,offsetY:0,type:\"iconset\",created:function(){this.iconMap={};this.iconNames=[];this.themes={}},ready:function(){if(this.src&&this.ownerDocument!==document){this.src=this.resolvePath(this.src,this.ownerDocument.baseURI)}this.super();this.updateThemes()},iconsChanged:function(){var ox=this.offsetX;var oy=this.offsetY;this.icons&&this.icons.split(/\\s+/g).forEach(function(name,i){this.iconNames.push(name);this.iconMap[name]={offsetX:ox,offsetY:oy};if(ox+this.iconSize<this.width){ox+=this.iconSize}else{ox=this.offsetX;oy+=this.iconSize}},this)},updateThemes:function(){var ts=this.querySelectorAll(\"property[theme]\");ts&&ts.array().forEach(function(t){this.themes[t.getAttribute(\"theme\")]={offsetX:parseInt(t.getAttribute(\"offsetX\"))||0,offsetY:parseInt(t.getAttribute(\"offsetY\"))||0}},this)},getOffset:function(icon,theme){var i=this.iconMap[icon];if(!i){var n=this.iconNames[Number(icon)];i=this.iconMap[n]}var t=this.themes[theme];if(i&&t){return{offsetX:i.offsetX+t.offsetX,offsetY:i.offsetY+t.offsetY}}return i},applyIcon:function(element,icon,scale){var offset=this.getOffset(icon);scale=scale||1;if(element&&offset){var icon=element._icon||document.createElement(\"div\");var style=icon.style;style.backgroundImage=\"url(\"+this.src+\")\";style.backgroundPosition=-offset.offsetX*scale+\"px\"+\" \"+(-offset.offsetY*scale+\"px\");style.backgroundSize=scale===1?\"auto\":this.width*scale+\"px\";if(icon.parentNode!==element){element.appendChild(icon)}return icon}}});</script></polymer-element><style shim-shadowdom=\"\">html /deep/ core-icon{display:inline-block;vertical-align:middle;background-repeat:no-repeat;fill:currentcolor;position:relative;height:24px;width:24px}</style><polymer-element name=\"core-icon\" attributes=\"src icon alt\" assetpath=\"../core-icon/\"><script>(function(){var meta;Polymer(\"core-icon\",{src:\"\",icon:\"\",alt:null,observe:{icon:\"updateIcon\",alt:\"updateAlt\"},defaultIconset:\"icons\",ready:function(){if(!meta){meta=document.createElement(\"core-iconset\")}if(this.hasAttribute(\"aria-label\")){if(!this.hasAttribute(\"role\")){this.setAttribute(\"role\",\"img\")}return}this.updateAlt()},srcChanged:function(){var icon=this._icon||document.createElement(\"div\");icon.textContent=\"\";icon.setAttribute(\"fit\",\"\");icon.style.backgroundImage=\"url(\"+this.src+\")\";icon.style.backgroundPosition=\"center\";icon.style.backgroundSize=\"100%\";if(!icon.parentNode){this.appendChild(icon)}this._icon=icon},getIconset:function(name){return meta.byId(name||this.defaultIconset)},updateIcon:function(oldVal,newVal){if(!this.icon){this.updateAlt();return}var parts=String(this.icon).split(\":\");var icon=parts.pop();if(icon){var set=this.getIconset(parts.pop());if(set){this._icon=set.applyIcon(this,icon);if(this._icon){this._icon.setAttribute(\"fit\",\"\")}}}if(oldVal){if(oldVal.split(\":\").pop()==this.getAttribute(\"aria-label\")){this.updateAlt()}}},updateAlt:function(){if(this.getAttribute(\"aria-hidden\")){return}if(this.alt===\"\"){this.setAttribute(\"aria-hidden\",\"true\");if(this.hasAttribute(\"role\")){this.removeAttribute(\"role\")}if(this.hasAttribute(\"aria-label\")){this.removeAttribute(\"aria-label\")}}else{this.setAttribute(\"aria-label\",this.alt||this.icon.split(\":\").pop());if(!this.hasAttribute(\"role\")){this.setAttribute(\"role\",\"img\")}if(this.hasAttribute(\"aria-hidden\")){this.removeAttribute(\"aria-hidden\")}}}})})();</script></polymer-element><polymer-element name=\"core-iconset-svg\" extends=\"core-meta\" attributes=\"iconSize\" assetpath=\"../core-iconset-svg/\"><script>Polymer(\"core-iconset-svg\",{iconSize:24,type:\"iconset\",created:function(){this._icons={}},ready:function(){this.super();this.updateIcons()},iconById:function(id){return this._icons[id]||(this._icons[id]=this.querySelector(\"#\"+id))},cloneIcon:function(id){var icon=this.iconById(id);if(icon){var content=icon.cloneNode(true);content.removeAttribute(\"id\");var svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");svg.setAttribute(\"viewBox\",\"0 0 \"+this.iconSize+\" \"+this.iconSize);svg.style.pointerEvents=\"none\";svg.appendChild(content);return svg}},get iconNames(){if(!this._iconNames){this._iconNames=this.findIconNames()}return this._iconNames},findIconNames:function(){var icons=this.querySelectorAll(\"[id]\").array();if(icons.length){return icons.map(function(n){return n.id})}},applyIcon:function(element,icon){var root=element;var old=root.querySelector(\"svg\");if(old){old.remove()}var svg=this.cloneIcon(icon);if(!svg){return}svg.setAttribute(\"height\",\"100%\");svg.setAttribute(\"width\",\"100%\");svg.setAttribute(\"preserveAspectRatio\",\"xMidYMid meet\");svg.style.display=\"block\";root.insertBefore(svg,root.firstElementChild);return svg},updateIcons:function(selector,method){selector=selector||\"[icon]\";method=method||\"updateIcon\";var deep=window.ShadowDOMPolyfill?\"\":\"html /deep/ \";var i$=document.querySelectorAll(deep+selector);for(var i=0,e;e=i$[i];i++){if(e[method]){e[method].call(e)}}}});</script></polymer-element><core-iconset-svg id=\"icons\" iconsize=\"24\"><svg><defs><g id=\"accessibility\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6h-2v-13h-6v-2h18v2z\"/></g><g id=\"account-balance\"><path d=\"M4 10v7h3v-7h-3zm6 0v7h3v-7h-3zm-8 12h19v-3h-19v3zm14-12v7h3v-7h-3zm-4.5-9l-9.5 5v2h19v-2l-9.5-5z\"/></g><g id=\"account-balance-wallet\"><path d=\"M21 18v1c0 1.1-.9 2-2 2h-14c-1.11 0-2-.9-2-2v-14c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10v-8h-10v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g><g id=\"account-box\"><path d=\"M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-14c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1h-12v-1z\"/></g><g id=\"account-child\"><path d=\"M16.5 12c1.38 0 2.49-1.12 2.49-2.5s-1.11-2.5-2.49-2.5c-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5zm-7.5-1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75v2.25h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zm-7.5-1c-2.33 0-7 1.17-7 3.5v2.5h7v-2.25c0-.85.33-2.34 2.37-3.47-.87-.18-1.71-.28-2.37-.28z\"/></g><g id=\"account-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\"/></g><g id=\"add-box\"><path d=\"M19 3h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g><g id=\"add-circle-outline\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g><g id=\"add-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g><g id=\"add\"><path d=\"M19 13h-6v6h-2v-6h-6v-2h6v-6h2v6h6v2z\"/></g><g id=\"add-shopping-cart\"><path d=\"M11 9h2v-3h3v-2h-3v-3h-2v3h-3v2h3v3zm-4 9c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm10 0c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-9.83-3.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.86-7.01-1.74-.96h-.01l-1.1 2-2.76 5h-7.02l-.13-.27-2.24-4.73-.95-2-.94-2h-3.27v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.13 0-.25-.11-.25-.25z\"/></g><g id=\"alarm-add\"><path d=\"M7.88 3.39l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm14.12 2.33l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-10-1.72c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\"/></g><g id=\"alarm-off\"><path d=\"M12 6c3.87 0 7 3.13 7 7 0 .84-.16 1.65-.43 2.4l1.52 1.52c.58-1.19.91-2.51.91-3.92 0-4.97-4.03-9-9-9-1.41 0-2.73.33-3.92.91l1.52 1.52c.75-.27 1.56-.43 2.4-.43zm10-.28l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-19.08-3.43l-1.27 1.28 1.33 1.33-1.11.93 1.42 1.42 1.11-.94.8.8c-1.37 1.58-2.2 3.64-2.2 5.89 0 4.97 4.02 9 9 9 2.25 0 4.31-.83 5.89-2.2l2.2 2.2 1.27-1.27-17.47-17.46-.97-.98zm13.55 16.1c-1.21 1-2.77 1.61-4.47 1.61-3.87 0-7-3.13-7-7 0-1.7.61-3.26 1.61-4.47l9.86 9.86zm-8.45-15.11l-1.42-1.42-.86.71 1.42 1.42.86-.71z\"/></g><g id=\"alarm-on\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.12.61c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-1.46-5.47l-2.13-2.13-1.06 1.06 3.18 3.18 6-6-1.06-1.06-4.93 4.95z\"/></g><g id=\"alarm\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.62 4.61h-1.5v6l4.75 2.85.75-1.23-4-2.37v-5.25zm-.5-4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g><g id=\"android\"><path d=\"M6 18c0 .55.45 1 1 1h1v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h2v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h1c.55 0 1-.45 1-1v-10h-12v10zm-2.5-10c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm17 0c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm-4.97-5.84l1.3-1.3c.2-.2.2-.51 0-.71-.2-.2-.51-.2-.71 0l-1.48 1.48c-.79-.4-1.69-.63-2.64-.63-.96 0-1.86.23-2.66.63l-1.49-1.48c-.2-.2-.51-.2-.71 0-.2.2-.2.51 0 .71l1.31 1.31c-1.48 1.09-2.45 2.84-2.45 4.83h12c0-1.99-.97-3.75-2.47-4.84zm-5.53 2.84h-1v-1h1v1zm5 0h-1v-1h1v1z\"/></g><g id=\"announcement\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7 9h-2v-6h2v6zm0 4h-2v-2h2v2z\"/></g><g id=\"apps\"><path d=\"M4 8h4v-4h-4v4zm6 12h4v-4h-4v4zm-6 0h4v-4h-4v4zm0-6h4v-4h-4v4zm6 0h4v-4h-4v4zm6-10v4h4v-4h-4zm-6 4h4v-4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"/></g><g id=\"archive\"><path d=\"M20.54 5.23l-1.39-1.68c-.27-.34-.68-.55-1.15-.55h-12c-.47 0-.88.21-1.16.55l-1.38 1.68c-.29.34-.46.79-.46 1.27v12.5c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12.5c0-.48-.17-.93-.46-1.27zm-8.54 12.27l-5.5-5.5h3.5v-2h4v2h3.5l-5.5 5.5zm-6.88-12.5l.81-1h12l.94 1h-13.75z\"/></g><g id=\"arrow-back\"><path d=\"M20 11h-12.17l5.59-5.59-1.42-1.41-8 8 8 8 1.41-1.41-5.58-5.59h12.17v-2z\"/></g><g id=\"arrow-drop-down-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 12l-4-4h8l-4 4z\"/></g><g id=\"arrow-drop-down\"><path d=\"M7 10l5 5 5-5z\"/></g><g id=\"arrow-drop-up\"><path d=\"M7 14l5-5 5 5z\"/></g><g id=\"arrow-forward\"><path d=\"M12 4l-1.41 1.41 5.58 5.59h-12.17v2h12.17l-5.58 5.59 1.41 1.41 8-8z\"/></g><g id=\"aspect-ratio\"><path d=\"M19 12h-2v3h-3v2h5v-5zm-12-3h3v-2h-5v5h2v-3zm14-6h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g><g id=\"assessment\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g><g id=\"assignment-ind\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 4c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1.4c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1.4z\"/></g><g id=\"assignment-late\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6 15h-2v-2h2v2zm0-4h-2v-6h2v6zm-1-9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g><g id=\"assignment\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14h-7v-2h7v2zm3-4h-10v-2h10v2zm0-4h-10v-2h10v2z\"/></g><g id=\"assignment-returned\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3v-4h4v4h3l-5 5z\"/></g><g id=\"assignment-return\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm4 12h-4v3l-5-5 5-5v3h4v4z\"/></g><g id=\"assignment-turned-in\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-2 14l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g><g id=\"attachment\"><path d=\"M7.5 18c-3.04 0-5.5-2.46-5.5-5.5s2.46-5.5 5.5-5.5h10.5c2.21 0 4 1.79 4 4s-1.79 4-4 4h-8.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5h7.5v1.5h-7.5c-.55 0-1 .45-1 1s.45 1 1 1h8.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5h-10.5c-2.21 0-4 1.79-4 4s1.79 4 4 4h9.5v1.5h-9.5z\"/></g><g id=\"autorenew\"><path d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26l1.46-1.46c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74l-1.46 1.46c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"/></g><g id=\"backspace\"><path d=\"M22 3h-15c-.69 0-1.23.35-1.59.88l-5.41 8.12 5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-3 12.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g><g id=\"backup\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g><g id=\"block\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-8 10c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69l-11.21 11.21c-1.06-1.35-1.69-3.05-1.69-4.9zm8 8c-1.85 0-3.55-.63-4.9-1.69l11.21-11.21c1.06 1.35 1.69 3.05 1.69 4.9 0 4.42-3.58 8-8 8z\"/></g><g id=\"bookmark-outline\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g><g id=\"bookmark\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g><g id=\"book\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g><g id=\"bug-report\"><path d=\"M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96l1.63-1.63-1.41-1.41-2.17 2.17c-.46-.11-.93-.17-1.42-.17-.49 0-.96.06-1.41.17l-2.18-2.17-1.41 1.41 1.62 1.63c-.74.51-1.36 1.18-1.81 1.96h-2.81v2h2.09c-.05.33-.09.66-.09 1v1h-2v2h2v1c0 .34.04.67.09 1h-2.09v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3h2.81v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1h2.09v-2zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z\"/></g><g id=\"cached\"><path d=\"M19 8l-4 4h3c0 3.31-2.69 6-6 6-1.01 0-1.97-.25-2.8-.7l-1.46 1.46c1.23.78 2.69 1.24 4.26 1.24 4.42 0 8-3.58 8-8h3l-4-4zm-13 4c0-3.31 2.69-6 6-6 1.01 0 1.97.25 2.8.7l1.46-1.46c-1.23-.78-2.69-1.24-4.26-1.24-4.42 0-8 3.58-8 8h-3l4 4 4-4h-3z\"/></g><g id=\"cancel\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm5 13.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g><g id=\"check-box-outline-blank\"><path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></g><g id=\"check-box\"><path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></g><g id=\"check\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g><g id=\"chevron-left\"><path d=\"M15.41 7.41l-1.41-1.41-6 6 6 6 1.41-1.41-4.58-4.59z\"/></g><g id=\"chevron-right\"><path d=\"M10 6l-1.41 1.41 4.58 4.59-4.58 4.59 1.41 1.41 6-6z\"/></g><g id=\"class\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g><g id=\"clear\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g><g id=\"close\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g><g id=\"cloud-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm4.5 14h-8.5c-1.66 0-3-1.34-3-3s1.34-3 3-3l.14.01c.44-1.73 1.99-3.01 3.86-3.01 2.21 0 4 1.79 4 4h.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5z\"/></g><g id=\"cloud-done\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-9.35 6.96l-3.5-3.5 1.41-1.41 2.09 2.08 5.18-5.17 1.41 1.41-6.59 6.59z\"/></g><g id=\"cloud-download\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-2.35 2.96l-5 5-5-5h3v-4h4v4h3z\"/></g><g id=\"cloud-off\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-1.48 0-2.85.43-4.01 1.17l1.46 1.46c.76-.4 1.63-.63 2.55-.63 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3 0 1.13-.64 2.11-1.56 2.62l1.45 1.45c1.27-.91 2.11-2.39 2.11-4.07 0-2.64-2.05-4.78-4.65-4.96zm-16.35-4.77l2.75 2.74c-3.19.14-5.75 2.76-5.75 5.99 0 3.31 2.69 6 6 6h11.73l2 2 1.27-1.27-16.73-16.73-1.27 1.27zm4.73 4.73l8 8h-9.73c-2.21 0-4-1.79-4-4s1.79-4 4-4h1.73z\"/></g><g id=\"cloud\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z\"/></g><g id=\"cloud-queue\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-.35 7.96h-13c-2.21 0-4-1.79-4-4s1.79-4 4-4h.71c.66-2.31 2.77-4 5.29-4 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3s-1.34 3-3 3z\"/></g><g id=\"cloud-upload\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g><g id=\"content-copy\"><path d=\"M16 1h-12c-1.1 0-2 .9-2 2v14h2v-14h12v-2zm3 4h-11c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-11v-14h11v14z\"/></g><g id=\"content-cut\"><path d=\"M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4s-4 1.79-4 4 1.79 4 4 4c.59 0 1.14-.13 1.64-.36l2.36 2.36-2.36 2.36c-.5-.23-1.05-.36-1.64-.36-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64l2.36-2.36 7 7h3v-1l-12.36-12.36zm-3.64.36c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zm7-9.5l-6 6 2 2 7-7v-1z\"/></g><g id=\"content-paste\"><path d=\"M19 2h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18h-14v-16h2v3h10v-3h2v16z\"/></g><g id=\"create\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g><g id=\"credit-card\"><path d=\"M4 12h16v6h-16z\"/><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g><g id=\"dashboard\"><path d=\"M3 13h8v-10h-8v10zm0 8h8v-6h-8v6zm10 0h8v-10h-8v10zm0-18v6h8v-6h-8z\"/></g><g id=\"delete\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-12h-12v12zm13-15h-3.5l-1-1h-5l-1 1h-3.5v2h14v-2z\"/></g><g id=\"description\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 16h-8v-2h8v2zm0-4h-8v-2h8v2zm-3-5v-5.5l5.5 5.5h-5.5z\"/></g><g id=\"developer-mode-tv\"><path d=\"M4 5h16v2h2v-2c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v2h2v-2zm3.55 8.83l-2.83-2.83 2.83-2.83-1.41-1.41-4.25 4.24 4.24 4.24 1.42-1.41zm12.45 3.17h-16v-2h-2v2c0 1.1.9 2 2 2h4v2h8v-2h4c1.1 0 1.99-.9 1.99-2v-2h-1.99v2zm2-6.01l-4.24-4.24-1.41 1.41 2.82 2.84-2.83 2.83 1.41 1.41 4.25-4.23v-.02z\"/></g><g id=\"dns\"><path d=\"M20 13h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm13-16h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g><g id=\"done-all\"><path d=\"M18 7l-1.41-1.41-6.34 6.34 1.41 1.41 6.34-6.34zm4.24-1.41l-10.58 10.58-4.18-4.17-1.41 1.41 5.59 5.59 12-12-1.42-1.41zm-21.83 7.82l5.59 5.59 1.41-1.41-5.58-5.59-1.42 1.41z\"/></g><g id=\"done\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g><g id=\"drafts\"><path d=\"M21.99 8c0-.72-.37-1.35-.94-1.7l-9.05-5.3-9.05 5.3c-.57.35-.95.98-.95 1.7v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2l-.01-10zm-9.99 5l-8.26-5.16 8.26-4.84 8.26 4.84-8.26 5.16z\"/></g><g id=\"drawer\"><path d=\"M20,4H4C2.8,4,2,4.8,2,6v12c0,1.2,0.8,2,2,2h16c1,0,2-0.8,2-2V6C22,4.8,21,4,20,4z M20,18h-6V6h6V18z\"/></g><g id=\"error\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-2h2v2zm0-4h-2v-6h2v6z\"/></g><g id=\"event\"><path d=\"M17 12h-5v5h5v-5zm-1-11v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-1v-2h-2zm3 18h-14v-11h14v11z\"/></g><g id=\"exit-to-app\"><path d=\"M10.09 15.59l1.41 1.41 5-5-5-5-1.41 1.41 2.58 2.59h-9.67v2h9.67l-2.58 2.59zm8.91-12.59h-14c-1.11 0-2 .9-2 2v4h2v-4h14v14h-14v-4h-2v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g><g id=\"expand-less\"><path d=\"M12 8l-6 6 1.41 1.41 4.59-4.58 4.59 4.58 1.41-1.41z\"/></g><g id=\"expand-more\"><path d=\"M16.59 8.59l-4.59 4.58-4.59-4.58-1.41 1.41 6 6 6-6z\"/></g><g id=\"explore\"><path d=\"M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zm0-8.9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm2.19 12.19l-8.19 3.81 3.81-8.19 8.19-3.81-3.81 8.19z\"/></g><g id=\"extension\"><path d=\"M20.5 11h-1.5v-4c0-1.1-.9-2-2-2h-4v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5h-4c-1.1 0-1.99.9-1.99 2v3.8h1.49c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7h-1.5v3.8c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7v1.5h3.8c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5z\"/></g><g id=\"face-unlock\"><path d=\"M14.69 17.1c-.74.58-1.7.9-2.69.9s-1.95-.32-2.69-.9c-.22-.17-.53-.13-.7.09-.17.22-.13.53.09.7.91.72 2.09 1.11 3.3 1.11s2.39-.39 3.31-1.1c.22-.17.26-.48.09-.7-.17-.23-.49-.26-.71-.1z\"/><circle cx=\"8.5\" cy=\"12.5\" r=\"1\"/><path d=\"M12 0c-6.63 0-12 5.37-12 12s5.37 12 12 12 12-5.37 12-12-5.37-12-12-12zm7.96 14.82c-1.09 3.74-4.27 6.46-8.04 6.46-3.78 0-6.96-2.72-8.04-6.47-1.19-.11-2.13-1.18-2.13-2.52 0-1.27.85-2.31 1.97-2.5 2.09-1.46 3.8-3.49 4.09-5.05v-.01c1.35 2.63 6.3 5.19 11.83 5.06l.3-.03c1.28 0 2.31 1.14 2.31 2.54 0 1.38-1.02 2.51-2.29 2.52z\"/><circle cx=\"15.5\" cy=\"12.5\" r=\"1\"/></g><g id=\"favorite-outline\"><path d=\"M16.5 3c-1.74 0-3.41.81-4.5 2.09-1.09-1.28-2.76-2.09-4.5-2.09-3.08 0-5.5 2.42-5.5 5.5 0 3.78 3.4 6.86 8.55 11.54l1.45 1.31 1.45-1.32c5.15-4.67 8.55-7.75 8.55-11.53 0-3.08-2.42-5.5-5.5-5.5zm-4.4 15.55l-.1.1-.1-.1c-4.76-4.31-7.9-7.16-7.9-10.05 0-2 1.5-3.5 3.5-3.5 1.54 0 3.04.99 3.57 2.36h1.87c.52-1.37 2.02-2.36 3.56-2.36 2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z\"/></g><g id=\"favorite\"><path d=\"M12 21.35l-1.45-1.32c-5.15-4.67-8.55-7.75-8.55-11.53 0-3.08 2.42-5.5 5.5-5.5 1.74 0 3.41.81 4.5 2.09 1.09-1.28 2.76-2.09 4.5-2.09 3.08 0 5.5 2.42 5.5 5.5 0 3.78-3.4 6.86-8.55 11.54l-1.45 1.31z\"/></g><g id=\"file-download\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g><g id=\"file-map\"><path d=\"M12 6.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm7-5.5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6.5 16h-1c-.95-4.09-3.99-5.84-3.99-9 0-2.49 2-4.5 4.49-4.5s4.51 2.01 4.51 4.5c0 3.16-3.06 4.91-4.01 9z\"/></g><g id=\"file-upload\"><path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2h-14z\"/></g><g id=\"filter-list\"><path d=\"M10 18h4v-2h-4v2zm-7-12v2h18v-2h-18zm3 7h12v-2h-12v2z\"/></g><g id=\"find-in-page\"><path d=\"M20 19.59v-11.59l-6-6h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84zm-11-6.59c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z\"/></g><g id=\"find-replace\"><path d=\"M11 6c1.38 0 2.63.56 3.54 1.46l-2.54 2.54h6v-6l-2.05 2.05c-1.27-1.27-3.02-2.05-4.95-2.05-3.53 0-6.43 2.61-6.92 6h2.02c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14h-2.02c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46l2.54-2.54h-6v6l2.05-2.05c1.27 1.27 3.02 2.05 4.95 2.05 1.55 0 2.98-.51 4.14-1.36l4.86 4.85 1.49-1.49-4.85-4.86z\"/></g><g id=\"flag\"><path d=\"M14.4 6l-.4-2h-9v17h2v-7h5.6l.4 2h7v-10z\"/></g><g id=\"flip-to-back\"><path d=\"M9 7h-2v2h2v-2zm0 4h-2v2h2v-2zm0-8c-1.11 0-2 .9-2 2h2v-2zm4 12h-2v2h2v-2zm6-12v2h2c0-1.1-.9-2-2-2zm-6 0h-2v2h2v-2zm-4 14v-2h-2c0 1.1.89 2 2 2zm10-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm-14-10h-2v12c0 1.1.89 2 2 2h12v-2h-12v-12zm10-2h2v-2h-2v2zm0 12h2v-2h-2v2z\"/></g><g id=\"flip-to-front\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm2 4v-2h-2c0 1.1.89 2 2 2zm-2-12h2v-2h-2v2zm12 12h2v-2h-2v2zm4-18h-10c-1.11 0-2 .9-2 2v10c0 1.1.89 2 2 2h10c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-10v-10h10v10zm-8 6h2v-2h-2v2zm-4 0h2v-2h-2v2z\"/></g><g id=\"folder-open\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-16v-10h16v10z\"/></g><g id=\"folder\"><path d=\"M10 4h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-8l-2-2z\"/></g><g id=\"folder-shared\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-5 3c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 8h-8v-1c0-1.33 2.67-2 4-2s4 .67 4 2v1z\"/></g><g id=\"forward\"><path d=\"M12 8v-4l8 8-8 8v-4h-8v-8z\"/></g><g id=\"fullscreen-exit\"><path d=\"M5 16h3v3h2v-5h-5v2zm3-8h-3v2h5v-5h-2v3zm6 11h2v-3h3v-2h-5v5zm2-11v-3h-2v5h5v-2h-3z\"/></g><g id=\"fullscreen\"><path d=\"M7 14h-2v5h5v-2h-3v-3zm-2-4h2v-3h3v-2h-5v5zm12 7h-3v2h5v-5h-2v3zm-3-12v2h3v3h2v-5h-5z\"/></g><g id=\"gesture\"><path d=\"M4.59 6.89c.7-.71 1.4-1.35 1.71-1.22.5.2 0 1.03-.3 1.52-.25.42-2.86 3.89-2.86 6.31 0 1.28.48 2.34 1.34 2.98.75.56 1.74.73 2.64.46 1.07-.31 1.95-1.4 3.06-2.77 1.21-1.49 2.83-3.44 4.08-3.44 1.63 0 1.65 1.01 1.76 1.79-3.78.64-5.38 3.67-5.38 5.37 0 1.7 1.44 3.09 3.21 3.09 1.63 0 4.29-1.33 4.69-6.1h2.46v-2.5h-2.47c-.15-1.65-1.09-4.2-4.03-4.2-2.25 0-4.18 1.91-4.94 2.84-.58.73-2.06 2.48-2.29 2.72-.25.3-.68.84-1.11.84-.45 0-.72-.83-.36-1.92.35-1.09 1.4-2.86 1.85-3.52.78-1.14 1.3-1.92 1.3-3.28 0-2.17-1.64-2.86-2.51-2.86-1.32 0-2.47 1-2.72 1.25-.36.36-.66.66-.88.93l1.75 1.71zm9.29 11.66c-.31 0-.74-.26-.74-.72 0-.6.73-2.2 2.87-2.76-.3 2.69-1.43 3.48-2.13 3.48z\"/></g><g id=\"get-app\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g><g id=\"grade\"><path d=\"M12 17.27l6.18 3.73-1.64-7.03 5.46-4.73-7.19-.61-2.81-6.63-2.81 6.63-7.19.61 5.46 4.73-1.64 7.03z\"/></g><g id=\"group-work\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-4 15.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zm1.5-9.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5-2.5-1.12-2.5-2.5zm6.5 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g><g id=\"help\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92c-.72.73-1.17 1.33-1.17 2.83h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2h-2c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\"/></g><g id=\"highlight-remove\"><path d=\"M14.59 8l-2.59 2.59-2.59-2.59-1.41 1.41 2.59 2.59-2.59 2.59 1.41 1.41 2.59-2.59 2.59 2.59 1.41-1.41-2.59-2.59 2.59-2.59-1.41-1.41zm-2.59-6c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g><g id=\"history\"><path opacity=\".9\" d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g><g id=\"home\"><path d=\"M10 20v-6h4v6h5v-8h3l-10-9-10 9h3v8z\"/></g><g id=\"https\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g><g id=\"inbox\"><path d=\"M19 3h-14.01c-1.1 0-1.98.9-1.98 2l-.01 14c0 1.1.89 2 1.99 2h14.01c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 12h-4c0 1.66-1.34 3-3 3s-3-1.34-3-3h-4.01v-10h14.01v10zm-3-5h-2v-3h-4v3h-2l4 4 4-4z\"/></g><g id=\"info-outline\"><path d=\"M11 17h2v-6h-2v6zm1-15c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-11h2v-2h-2v2z\"/></g><g id=\"info\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-6h2v6zm0-8h-2v-2h2v2z\"/></g><g id=\"input\"><path d=\"M21 3.01h-18c-1.1 0-2 .9-2 2v3.99h2v-4.01h18v14.03h-18v-4.02h-2v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zm-10 12.99l4-4-4-4v3h-10v2h10v3z\"/></g><g id=\"invert-colors\"><path d=\"M17.66 7.93l-5.66-5.66-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34 2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zm-5.66 11.66c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24s.62-3.11 1.76-4.24l4.24-4.25v14.49z\"/></g><g id=\"label-outline\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16zm-1.63 11.16h-11v-10h11l3.55 5-3.55 5z\"/></g><g id=\"label\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16z\"/></g><g id=\"language\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zm-6.92-3.96c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zm-7.74 9.96c-.16-.64-.26-1.31-.26-2s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2h-3.38zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8h-2.95c.96-1.66 2.49-2.93 4.33-3.56-.6 1.11-1.06 2.31-1.38 3.56zm3.97 11.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zm2.34-5.96h-4.68c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zm1.77-5.56c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z\"/></g><g id=\"launch\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g><g id=\"link\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4v-1.9h-4c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9h-4c-1.71 0-3.1-1.39-3.1-3.1zm4.1 1h8v-2h-8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4v1.9h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></g><g id=\"list\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm4 4h14v-2h-14v2zm0 4h14v-2h-14v2zm0-10v2h14v-2h-14z\"/></g><g id=\"lock-open\"><path d=\"M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2h-9.1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-12v-10h12v10z\"/></g><g id=\"lock-outline\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6-5.1c1.71 0 3.1 1.39 3.1 3.1v2h-6.1v-2h-.1c0-1.71 1.39-3.1 3.1-3.1zm6 17.1h-12v-10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></g><g id=\"lock\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g><g id=\"loyalty\"><path d=\"M21.41 11.58l-9-9c-.36-.36-.86-.58-1.41-.58h-7c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zm-15.91-4.58c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11.77 8.27l-4.27 4.27-4.27-4.27c-.45-.46-.73-1.08-.73-1.77 0-1.38 1.12-2.5 2.5-2.5.69 0 1.32.28 1.77.74l.73.72.73-.73c.45-.45 1.08-.73 1.77-.73 1.38 0 2.5 1.12 2.5 2.5 0 .69-.28 1.32-.73 1.77z\"/></g><g id=\"mail\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g><g id=\"markunread-mailbox\"><path d=\"M20 6h-10v6h-2v-8h6v-4h-8v6h-2c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2z\"/></g><g id=\"markunread\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g><g id=\"menu\"><path d=\"M3 18h18v-2h-18v2zm0-5h18v-2h-18v2zm0-7v2h18v-2h-18z\"/></g><g id=\"more-horiz\"><path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g><g id=\"more-vert\"><path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g><g id=\"note-add\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 14h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2zm-3-7v-5.5l5.5 5.5h-5.5z\"/></g><g id=\"open-in-browser\"><path d=\"M19 4h-14c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2h-4v-10h14v10h-4v2h4c1.1 0 2-.9 2-2v-12c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"/></g><g id=\"open-in-new\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g><g id=\"open-with\"><path d=\"M10 9h4v-3h3l-5-5-5 5h3v3zm-1 1h-3v-3l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3h-3l5 5 5-5h-3v-3z\"/></g><g id=\"pageview\"><path d=\"M11 8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8-5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-1.41 16l-3.83-3.83c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84-1.41 1.41z\"/></g><g id=\"payment\"><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g><g id=\"perm-camera-mic\"><path d=\"M20 5h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v-2.09c-2.83-.48-5-2.94-5-5.91h2c0 2.21 1.79 4 4 4s4-1.79 4-4h2c0 2.97-2.17 5.43-5 5.91v2.09h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-6 8c0 1.1-.9 2-2 2s-2-.9-2-2v-4c0-1.1.9-2 2-2s2 .9 2 2v4z\"/></g><g id=\"perm-contact-cal\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z\"/></g><g id=\"perm-data-setting\"><path d=\"M18.99 11.5c.34 0 .67.03 1 .07l.01-11.57-20 20h11.56c-.04-.33-.07-.66-.07-1 0-4.14 3.36-7.5 7.5-7.5zm3.71 7.99c.02-.16.04-.32.04-.49 0-.17-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.85-.49l-.19-1.32c-.01-.12-.12-.21-.24-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49 0 .17.01.33.03.49l-1.06.83c-.09.08-.12.21-.06.32l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.02.12.12.21.25.21h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.07-.83zm-3.71 1.01c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g><g id=\"perm-device-info\"><path d=\"M13 7h-2v2h2v-2zm0 4h-2v6h2v-6zm4-9.99l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g><g id=\"perm-identity\"><path d=\"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1-2.1-.94-2.1-2.1.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1h-12.2v-1.1c0-.64 3.13-2.1 6.1-2.1m0-10.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z\"/></g><g id=\"perm-media\"><path d=\"M2 6h-2v5h.01l-.01 9c0 1.1.9 2 2 2h18v-2h-18v-14zm20-2h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-15 11l4.5-6 3.5 4.51 2.5-3.01 3.5 4.5h-14z\"/></g><g id=\"perm-phone-msg\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-8-12.5v10l3-3h6v-7h-9z\"/></g><g id=\"perm-scan-wifi\"><path d=\"M12 3c-5.05 0-8.85 1.85-12 4.23l12 14.77 12-14.75c-3.15-2.38-6.95-4.25-12-4.25zm1 13h-2v-6h2v6zm-2-8v-2h2v2h-2z\"/></g><g id=\"picture-in-picture\"><path d=\"M19 7h-8v6h8v-6zm2-4h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.03h18v14.03z\"/></g><g id=\"polymer\"><path d=\"M19 4h-4l-7.89 12.63-2.61-4.63 4.5-8h-4l-4.5 8 4.5 8h4l7.89-12.63 2.61 4.63-4.5 8h4l4.5-8z\"/></g><g id=\"print\"><path d=\"M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11h-8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9h-12v4h12v-4z\"/></g><g id=\"query-builder\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g><g id=\"question-answer\"><path d=\"M21 6h-2v9h-13v2c0 .55.45 1 1 1h11l4 4v-15c0-.55-.45-1-1-1zm-4 6v-9c0-.55-.45-1-1-1h-13c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z\"/></g><g id=\"radio-button-off\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g><g id=\"radio-button-on\"><path d=\"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g><g id=\"receipt\"><path d=\"M18 17h-12v-2h12v2zm0-4h-12v-2h12v2zm0-4h-12v-2h12v2zm-15 13l1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5v-20l-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5v20z\"/></g><g id=\"redeem\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g><g id=\"redo\"><path d=\"M18.4 10.6c-1.85-1.61-4.25-2.6-6.9-2.6-4.65 0-8.58 3.03-9.96 7.22l2.36.78c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88l-3.62 3.62h9v-9l-3.6 3.6z\"/></g><g id=\"refresh\"><path d=\"M17.65 6.35c-1.45-1.45-3.44-2.35-5.65-2.35-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78l-3.22 3.22h7v-7l-2.35 2.35z\"/></g><g id=\"remove-circle-outline\"><path d=\"M7 11v2h10v-2h-10zm5-9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g><g id=\"remove-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-10v-2h10v2z\"/></g><g id=\"remove\"><path d=\"M19 13h-14v-2h14v2z\"/></g><g id=\"reorder\"><path d=\"M3,15h18v-2H3V15z M3,19h18v-2H3V19z M3,11h18V9H3V11z M3,5v2h18V5H3z\"/></g><g id=\"reply-all\"><path d=\"M7 8v-3l-7 7 7 7v-3l-4-4 4-4zm6 1v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g><g id=\"reply\"><path d=\"M10 9v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g><g id=\"report\"><path d=\"M15.73 3h-7.46l-5.27 5.27v7.46l5.27 5.27h7.46l5.27-5.27v-7.46l-5.27-5.27zm-3.73 14.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2v-6h2v6z\"/></g><g id=\"report-problem\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g><g id=\"restore\"><path d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g><g id=\"room\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g><g id=\"rotation-3d\"><path d=\"M7.52 21.48c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.81-1.33 1.32zm.89-6.52c-.19 0-.37-.03-.52-.08-.16-.06-.29-.13-.4-.24-.11-.1-.2-.22-.26-.37-.06-.14-.09-.3-.09-.47h-1.3c0 .36.07.68.21.95.14.27.33.5.56.69.24.18.51.32.82.41.3.1.62.15.96.15.37 0 .72-.05 1.03-.15.32-.1.6-.25.83-.44s.42-.43.55-.72c.13-.29.2-.61.2-.97 0-.19-.02-.38-.07-.56-.05-.18-.12-.35-.23-.51-.1-.16-.24-.3-.4-.43-.17-.13-.37-.23-.61-.31.2-.09.37-.2.52-.33.15-.13.27-.27.37-.42.1-.15.17-.3.22-.46.05-.16.07-.32.07-.48 0-.36-.06-.68-.18-.96-.12-.28-.29-.51-.51-.69-.2-.19-.47-.33-.77-.43-.31-.09-.65-.14-1.02-.14-.36 0-.69.05-1 .16-.3.11-.57.26-.79.45-.21.19-.38.41-.51.67-.12.26-.18.54-.18.85h1.3c0-.17.03-.32.09-.45s.14-.25.25-.34c.11-.09.23-.17.38-.22.15-.05.3-.08.48-.08.4 0 .7.1.89.31.19.2.29.49.29.86 0 .18-.03.34-.08.49-.05.15-.14.27-.25.37-.11.1-.25.18-.41.24-.16.06-.36.09-.58.09h-.77v1.03h.77c.22 0 .42.02.6.07s.33.13.45.23c.12.11.22.24.29.4.07.16.1.35.1.57 0 .41-.12.72-.35.93-.23.23-.55.33-.95.33zm8.55-5.92c-.32-.33-.7-.59-1.14-.77-.43-.18-.92-.27-1.46-.27h-2.36v8h2.3c.55 0 1.06-.09 1.51-.27.45-.18.84-.43 1.16-.76.32-.33.57-.73.74-1.19.17-.47.26-.99.26-1.57v-.4c0-.58-.09-1.1-.26-1.57-.18-.47-.43-.87-.75-1.2zm-.39 3.16c0 .42-.05.79-.14 1.13-.1.33-.24.62-.43.85-.19.23-.43.41-.71.53-.29.12-.62.18-.99.18h-.91v-5.77h.97c.72 0 1.27.23 1.64.69.38.46.57 1.12.57 1.99v.4zm-4.57-12.2l-.66.03 3.81 3.81 1.33-1.33c3.27 1.55 5.61 4.72 5.96 8.48h1.5c-.5-6.15-5.65-10.99-11.94-10.99z\"/></g><g id=\"save\"><path d=\"M17 3h-12c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-12l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10h-10v-4h10v4z\"/></g><g id=\"schedule\"><path fill-opacity=\".9\" d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path fill-opacity=\".9\" d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g><g id=\"search\"><path d=\"M15.5 14h-.79l-.28-.27c.98-1.14 1.57-2.62 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 2.91-6.5 6.5 2.91 6.5 6.5 6.5c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99 1.49-1.49-4.99-5zm-6 0c-2.49 0-4.5-2.01-4.5-4.5s2.01-4.5 4.5-4.5 4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5z\"/></g><g id=\"select-all\"><path d=\"M3 5h2v-2c-1.1 0-2 .9-2 2zm0 8h2v-2h-2v2zm4 8h2v-2h-2v2zm-4-12h2v-2h-2v2zm10-6h-2v2h2v-2zm6 0v2h2c0-1.1-.9-2-2-2zm-14 18v-2h-2c0 1.1.9 2 2 2zm-2-4h2v-2h-2v2zm6-14h-2v2h2v-2zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2v-2h-2v2zm-8 12h10v-10h-10v10zm2-8h6v6h-6v-6z\"/></g><g id=\"send-money\"><path d=\"M2 12c0-2.61 1.67-4.83 4-5.65v-2.09c-3.45.89-6 4.01-6 7.74s2.55 6.85 6 7.74v-2.09c-2.33-.82-4-3.04-4-5.65zm22 0l-4-4v3h-7v2h7v3l4-4zm-10 6c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.16.67 4.24 1.76l1.42-1.41c-1.45-1.45-3.45-2.35-5.66-2.35-4.42 0-8 3.58-8 8s3.58 8 8 8c2.21 0 4.21-.9 5.66-2.34l-1.42-1.41c-1.08 1.08-2.58 1.75-4.24 1.75z\"/></g><g id=\"send\"><path d=\"M2.01 21l20.99-9-20.99-9-.01 7 15 2-15 2z\"/></g><g id=\"settings-applications\"><path d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm7-7h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2v-14c0-1.1-.89-2-2-2zm-1.75 9c0 .23-.02.46-.05.68l1.48 1.16c.13.11.17.3.08.45l-1.4 2.42c-.09.15-.27.21-.43.15l-1.74-.7c-.36.28-.76.51-1.18.69l-.26 1.85c-.03.17-.18.3-.35.3h-2.8c-.17 0-.32-.13-.35-.29l-.26-1.85c-.43-.18-.82-.41-1.18-.69l-1.74.7c-.16.06-.34 0-.43-.15l-1.4-2.42c-.09-.15-.05-.34.08-.45l1.48-1.16c-.03-.23-.05-.46-.05-.69 0-.23.02-.46.05-.68l-1.48-1.16c-.13-.11-.17-.3-.08-.45l1.4-2.42c.09-.15.27-.21.43-.15l1.74.7c.36-.28.76-.51 1.18-.69l.26-1.85c.03-.17.18-.3.35-.3h2.8c.17 0 .32.13.35.29l.26 1.85c.43.18.82.41 1.18.69l1.74-.7c.16-.06.34 0 .43.15l1.4 2.42c.09.15.05.34-.08.45l-1.48 1.16c.03.23.05.46.05.69z\"/></g><g id=\"settings-backup-restore\"><path d=\"M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9h-3l4 4 4-4h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44c1.52 1.16 3.42 1.86 5.48 1.86 4.97 0 9-4.03 9-9s-4.03-9-9-9z\"/></g><g id=\"settings-bluetooth\"><path d=\"M11 24h2v-2h-2v2zm-4 0h2v-2h-2v2zm8 0h2v-2h-2v2zm2.71-18.29l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g><g id=\"settings-cell\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm1-23.99l-8-.01c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-16c0-1.1-.9-1.99-2-1.99zm0 15.99h-8v-12h8v12z\"/></g><g id=\"settings-display\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02zm-13-3.01h2.5l1.5 1.5 1.5-1.5h2.5v-2.5l1.5-1.5-1.5-1.5v-2.5h-2.5l-1.5-1.5-1.5 1.5h-2.5v2.5l-1.5 1.5 1.5 1.5v2.5zm4-7c1.66 0 3 1.34 3 3s-1.34 3-3 3v-6z\"/></g><g id=\"settings-ethernet\"><path d=\"M7.77 6.76l-1.54-1.28-5.41 6.52 5.41 6.52 1.54-1.28-4.35-5.24 4.35-5.24zm-.77 6.24h2v-2h-2v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28 4.35 5.24-4.35 5.24 1.54 1.28 5.41-6.52-5.41-6.52z\"/></g><g id=\"settings-input-antenna\"><path d=\"M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5c0 1.02.62 1.9 1.5 2.29v3.3l-3.41 3.41 1.41 1.41 3-3 3 3 1.41-1.41-3.41-3.41v-3.3zm-1-13.29c-6.07 0-11 4.93-11 11h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z\"/></g><g id=\"settings-input-component\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g><g id=\"settings-input-composite\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g><g id=\"settings-input-hdmi\"><path d=\"M18 7v-3c0-1.1-.9-2-2-2h-8c-1.1 0-2 .9-2 2v3h-1v6l3 6v3h8v-3l3-6v-6h-1zm-10-3h8v3h-2v-2h-1v2h-2v-2h-1v2h-2v-3z\"/></g><g id=\"settings-input-svideo\"><path d=\"M8 11.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5.67 1.5 1.5 1.5 1.5-.67 1.5-1.5zm7-5c0-.83-.67-1.5-1.5-1.5h-3c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5h3c.83 0 1.5-.67 1.5-1.5zm-6.5 8.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm3.5-14c-6.07 0-11 4.93-11 11s4.93 11 11 11 11-4.93 11-11-4.93-11-11-11zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9zm5.5-11c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm-2 5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"/></g><g id=\"settings-overscan\"><path d=\"M12.01 5.5l-2.01 2.5h4l-1.99-2.5zm5.99 4.5v4l2.5-1.99-2.5-2.01zm-12 0l-2.5 2.01 2.5 1.99v-4zm8 6h-4l2.01 2.5 1.99-2.5zm7-13h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g><g id=\"settings\"><path d=\"M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65c-.03-.24-.24-.42-.49-.42h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zm-7.43 2.52c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g><g id=\"settings-phone\"><path d=\"M13 9h-2v2h2v-2zm4 0h-2v2h2v-2zm3 6.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-6.5v2h2v-2h-2z\"/></g><g id=\"settings-power\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm2-22h-2v10h2v-10zm3.56 2.44l-1.45 1.45c1.73 1.05 2.89 2.94 2.89 5.11 0 3.31-2.69 6-6 6s-6-2.69-6-6c0-2.17 1.16-4.06 2.88-5.12l-1.44-1.44c-2.08 1.44-3.44 3.84-3.44 6.56 0 4.42 3.58 8 8 8s8-3.58 8-8c0-2.72-1.36-5.12-3.44-6.56zm-1.56 19.56h2v-2h-2v2z\"/></g><g id=\"settings-remote\"><path d=\"M15 9h-6c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-3 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm-4.95-8.95l1.41 1.41c.91-.9 2.16-1.46 3.54-1.46s2.63.56 3.54 1.46l1.41-1.41c-1.27-1.27-3.02-2.05-4.95-2.05s-3.68.78-4.95 2.05zm4.95-6.05c-3.04 0-5.79 1.23-7.78 3.22l1.41 1.41c1.63-1.62 3.88-2.63 6.37-2.63s4.74 1.01 6.36 2.64l1.41-1.41c-1.98-2-4.73-3.23-7.77-3.23z\"/></g><g id=\"settings-voice\"><path d=\"M7 24h2v-2h-2v2zm5-11c1.66 0 2.99-1.34 2.99-3l.01-6c0-1.66-1.34-3-3-3s-3 1.34-3 3v6c0 1.66 1.34 3 3 3zm-1 11h2v-2h-2v2zm4 0h2v-2h-2v2zm4-14h-1.7c0 3-2.54 5.1-5.3 5.1s-5.3-2.1-5.3-5.1h-1.7c0 3.41 2.72 6.23 6 6.72v3.28h2v-3.28c3.28-.49 6-3.31 6-6.72z\"/></g><g id=\"shop\"><path d=\"M16 6v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-6v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-13h-6zm-6-2h4v2h-4v-2zm-1 14v-9l7.5 4-7.5 5z\"/></g><g id=\"shopping-basket\"><path d=\"M17.21 9l-4.38-6.56c-.19-.28-.51-.42-.83-.42-.32 0-.64.14-.83.43l-4.38 6.55h-4.79c-.55 0-1 .45-1 1 0 .09.01.18.04.27l2.54 9.27c.23.84 1 1.46 1.92 1.46h13c.92 0 1.69-.62 1.93-1.46l2.54-9.27.03-.27c0-.55-.45-1-1-1h-4.79zm-8.21 0l3-4.4 3 4.4h-6zm3 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g><g id=\"shopping-cart\"><path d=\"M7 18c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-6-16v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1h-14.79l-.94-2h-3.27zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z\"/></g><g id=\"shop-two\"><path d=\"M3 9h-2v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2h-16v-11zm15-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-5v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2v-11h-5zm-6-2h4v2h-4v-2zm0 12v-7l5.5 3-5.5 4z\"/></g><g id=\"sort\"><path d=\"M3 18h6v-2h-6v2zm0-12v2h18v-2h-18zm0 7h12v-2h-12v2z\"/></g><g id=\"speaker-notes\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-12 12h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2v-2h2v2zm7 6h-5v-2h5v2zm3-3h-8v-2h8v2zm0-3h-8v-2h8v2z\"/></g><g id=\"spellcheck\"><path d=\"M12.45 16h2.09l-5.11-13h-1.86l-5.11 13h2.09l1.12-3h5.64l1.14 3zm-6.02-5l2.07-5.52 2.07 5.52h-4.14zm15.16.59l-8.09 8.09-3.67-3.68-1.41 1.41 5.09 5.09 9.49-9.5-1.41-1.41z\"/></g><g id=\"star-half\"><path d=\"M22 9.74l-7.19-.62L12 2.5 9.19 9.13 2 9.74l5.46 4.73-1.64 7.03L12 17.77l6.18 3.73-1.63-7.03L22 9.74zM12 15.9V6.6l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.9z\"/></g><g id=\"star-outline\"><path d=\"M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z\"/></g><g id=\"star\"><path d=\"M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"/></g><g id=\"star-rate\"><path d=\"M12 14.3l3.71 2.7-1.42-4.36 3.71-2.64h-4.55l-1.45-4.5-1.45 4.5h-4.55l3.71 2.64-1.42 4.36z\"/></g><g id=\"stars\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm4.24 16l-4.23-2.55-4.23 2.55 1.12-4.81-3.73-3.23 4.92-.42 1.92-4.54 1.92 4.53 4.92.42-3.73 3.23 1.12 4.82z\"/></g><g id=\"store\"><path d=\"M20 4h-16v2h16v-2zm1 10v-2l-1-5h-16l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4h-6v-4h6v4z\"/></g><g id=\"subject\"><path d=\"M14 17h-10v2h10v-2zm6-8h-16v2h16v-2zm-16 6h16v-2h-16v2zm0-10v2h16v-2h-16z\"/></g><g id=\"supervisor-account\"><circle cx=\"12\" cy=\"13.49\" r=\"1.5\"/><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 2.5c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25-2.25-1.01-2.25-2.25 1.01-2.25 2.25-2.25zm5 10.56v2.5c-.45.41-.96.77-1.5 1.05v-.68c0-.34-.17-.65-.46-.92-.65-.62-1.89-1.02-3.04-1.02-.96 0-1.96.28-2.65.73l-.17.12-.21.17c.78.47 1.63.72 2.54.82l1.33.15c.37.04.66.36.66.75 0 .29-.16.53-.4.66-.28.15-.64.09-.95.09-.35 0-.69-.01-1.03-.05-.5-.06-.99-.17-1.46-.33-.49-.16-.97-.38-1.42-.64-.22-.13-.44-.27-.65-.43l-.31-.24c-.04-.02-.28-.18-.28-.23v-4.28c0-1.58 2.63-2.78 5-2.78s5 1.2 5 2.78v1.78z\"/></g><g id=\"swap-horiz\"><path d=\"M6.99 11l-3.99 4 3.99 4v-3h7.01v-2h-7.01v-3zm14.01-2l-3.99-4v3h-7.01v2h7.01v3l3.99-4z\"/></g><g id=\"swap-vert-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-5.5 7l3.5-3.5 3.5 3.5h-2.5v4h-2v-4h-2.5zm11 6l-3.5 3.5-3.5-3.5h2.5v-4h2v4h2.5z\"/></g><g id=\"swap-vert\"><path d=\"M16 17.01v-7.01h-2v7.01h-3l4 3.99 4-3.99h-3zm-7-14.01l-4 3.99h3v7.01h2v-7.01h3l-4-3.99z\"/></g><g id=\"system-update-tv\"><path d=\"M12 16.5l4-4h-3v-9h-2v9h-3l4 4zm9-13h-6v1.99h6v14.03h-18v-14.03h6v-1.99h-6c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g><g id=\"tab\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-18v-14h10v4h8v10z\"/></g><g id=\"tab-unselected\"><path d=\"M1 9h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2c-1.1 0-2 .9-2 2zm8 16h2v-2h-2v2zm-8-4h2v-2h-2v2zm2 4v-2h-2c0 1.1.9 2 2 2zm18-18h-8v6h10v-4c0-1.1-.9-2-2-2zm0 14h2v-2h-2v2zm-12-12h2v-2h-2v2zm-4 16h2v-2h-2v2zm0-16h2v-2h-2v2zm16 16c1.1 0 2-.9 2-2h-2v2zm0-8h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 0h2v-2h-2v2z\"/></g><g id=\"text-format\"><path d=\"M5 17v2h14v-2h-14zm4.5-4.2h5l.9 2.2h2.1l-4.75-11h-1.5l-4.75 11h2.1l.9-2.2zm2.5-6.82l1.87 5.02h-3.74l1.87-5.02z\"/></g><g id=\"theaters\"><path d=\"M18 3v2h-2v-2h-8v2h-2v-2h-2v18h2v-2h2v2h8v-2h2v2h2v-18h-2zm-10 14h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g><g id=\"thumb-down\"><path d=\"M15 3h-9c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v1.91l.01.01-.01.08c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06l1.06 1.05 6.59-6.59c.36-.36.58-.86.58-1.41v-10c0-1.1-.9-2-2-2zm4 0v12h4v-12h-4z\"/></g><g id=\"thumbs-up-down\"><path d=\"M12 6c0-.55-.45-1-1-1h-5.18l.66-3.18.02-.23c0-.31-.13-.59-.33-.8l-.79-.79-4.94 4.94c-.27.27-.44.65-.44 1.06v6.5c0 .83.67 1.5 1.5 1.5h6.75c.62 0 1.15-.38 1.38-.91l2.26-5.29c.07-.17.11-.36.11-.55v-1.25zm10.5 4h-6.75c-.62 0-1.15.38-1.38.91l-2.26 5.29c-.07.17-.11.36-.11.55v1.25c0 .55.45 1 1 1h5.18l-.66 3.18-.02.24c0 .31.13.59.33.8l.79.78 4.94-4.94c.27-.27.44-.65.44-1.06v-6.5c0-.83-.67-1.5-1.5-1.5z\"/></g><g id=\"thumb-up\"><path d=\"M1 21h4v-12h-4v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06l-1.06-1.05-6.58 6.59c-.37.36-.59.86-.59 1.41v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01.01-.08z\"/></g><g id=\"toc\"><path d=\"M3 9h14v-2h-14v2zm0 4h14v-2h-14v2zm0 4h14v-2h-14v2zm16 0h2v-2h-2v2zm0-10v2h2v-2h-2zm0 6h2v-2h-2v2z\"/></g><g id=\"today\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11zm-12-9h5v5h-5z\"/></g><g id=\"track-changes\"><path d=\"M19.07 4.93l-1.41 1.41c1.44 1.45 2.34 3.45 2.34 5.66 0 4.42-3.58 8-8 8s-8-3.58-8-8c0-4.08 3.05-7.44 7-7.93v2.02c-2.84.48-5 2.94-5 5.91 0 3.31 2.69 6 6 6s6-2.69 6-6c0-1.66-.67-3.16-1.76-4.24l-1.41 1.41c.72.73 1.17 1.73 1.17 2.83 0 2.21-1.79 4-4 4s-4-1.79-4-4c0-1.86 1.28-3.41 3-3.86v2.14c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72v-8.28h-1c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10c0-2.76-1.12-5.26-2.93-7.07z\"/></g><g id=\"translate\"><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h2.93v-2h-7v-2h-2v2h-7v1.99h11.17c-.67 1.93-1.73 3.76-3.17 5.36-.93-1.03-1.7-2.16-2.31-3.35h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02 1.42 1.42 5-5 3.11 3.11.76-2.04zm5.63-5.07h-2l-4.5 12h2l1.12-3h4.75l1.13 3h2l-4.5-12zm-2.62 7l1.62-4.33 1.62 4.33h-3.24z\"/></g><g id=\"trending-down\"><path d=\"M16 18l2.29-2.29-4.88-4.88-4 4-7.41-7.42 1.41-1.41 6 6 4-4 6.3 6.29 2.29-2.29v6z\"/></g><g id=\"trending-neutral\"><path d=\"M22 12l-4-4v3h-15v2h15v3z\"/></g><g id=\"trending-up\"><path d=\"M16 6l2.29 2.29-4.88 4.88-4-4-7.41 7.42 1.41 1.41 6-6 4 4 6.3-6.29 2.29 2.29v-6z\"/></g><g id=\"turned-in-not\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g><g id=\"turned-in\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g><g id=\"undo\"><path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6l-3.6-3.6v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78c-1.39-4.19-5.32-7.22-9.97-7.22z\"/></g><g id=\"unfold-less\"><path d=\"M7.41 18.59l1.42 1.41 3.17-3.17 3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59zm9.18-13.18l-1.42-1.41-3.17 3.17-3.17-3.17-1.42 1.41 4.59 4.59 4.59-4.59z\"/></g><g id=\"unfold-more\"><path d=\"M12 5.83l3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59 1.42 1.41 3.17-3.17zm0 12.34l-3.17-3.17-1.41 1.41 4.58 4.59 4.59-4.59-1.42-1.41-3.17 3.17z\"/></g><g id=\"verified-user\"><path d=\"M12 1l-9 4v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12v-6l-9-4zm-2 16l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g><g id=\"view-agenda\"><path d=\"M20 13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm0-10h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1z\"/></g><g id=\"view-array\"><path d=\"M4 18h3v-13h-3v13zm14-13v13h3v-13h-3zm-10 13h9v-13h-9v13z\"/></g><g id=\"view-carousel\"><path d=\"M7 19h10v-15h-10v15zm-5-2h4v-11h-4v11zm16-11v11h4v-11h-4z\"/></g><g id=\"view-column\"><path d=\"M10 18h5v-13h-5v13zm-6 0h5v-13h-5v13zm12-13v13h5v-13h-5z\"/></g><g id=\"view-day\"><path d=\"M2 21h19v-3h-19v3zm18-13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-18-5v3h19v-3h-19z\"/></g><g id=\"view-headline\"><path d=\"M4 15h17v-2h-17v2zm0 4h17v-2h-17v2zm0-8h17v-2h-17v2zm0-6v2h17v-2h-17z\"/></g><g id=\"view-list\"><path d=\"M4 14h4v-4h-4v4zm0 5h4v-4h-4v4zm0-10h4v-4h-4v4zm5 5h12v-4h-12v4zm0 5h12v-4h-12v4zm0-14v4h12v-4h-12z\"/></g><g id=\"view-module\"><path d=\"M4 11h5v-6h-5v6zm0 7h5v-6h-5v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5v-6h-5v6zm6-6v6h5v-6h-5z\"/></g><g id=\"view-quilt\"><path d=\"M10 18h5v-6h-5v6zm-6 0h5v-13h-5v13zm12 0h5v-6h-5v6zm-6-13v6h11v-6h-11z\"/></g><g id=\"view-stream\"><path d=\"M4 18h17v-6h-17v6zm0-13v6h17v-6h-17z\"/></g><g id=\"view-week\"><path d=\"M6 5h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1z\"/></g><g id=\"visibility-off\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16c.57-.23 1.18-.36 1.83-.36zm-10-2.73l2.28 2.28.46.46c-1.66 1.29-2.96 3.01-3.74 4.99 1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42 2.93 2.92 1.27-1.27-17.73-17.73-1.27 1.27zm5.53 5.53l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></g><g id=\"visibility\"><path d=\"M12 4.5c-5 0-9.27 3.11-11 7.5 1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g><g id=\"wallet-giftcard\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g><g id=\"wallet-membership\"><path d=\"M20 2h-16c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h4v5l4-2 4 2v-5h4c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm0 13h-16v-2h16v2zm0-5h-16v-6h16v6z\"/></g><g id=\"wallet-travel\"><path d=\"M20 6h-3v-2c0-1.11-.89-2-2-2h-6c-1.11 0-2 .89-2 2v2h-3c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-11-2h6v2h-6v-2zm11 15h-16v-2h16v2zm0-5h-16v-6h3v2h2v-2h6v2h2v-2h3v6z\"/></g><g id=\"warning\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g><g id=\"work\"><path d=\"M24 0v24h-24v-24h24m1-1h-26v26h26v-26z\"/><path d=\"M20 6h-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-6 0h-4v-2h4v2z\"/></g></defs></svg></core-iconset-svg><polymer-element name=\"core-icon-button\" attributes=\"src icon active\" assetpath=\"../core-icon-button/\"><template><style>:host{display:inline-block;box-sizing:border-box;-moz-box-sizing:border-box;user-select:none;-moz-user-select:none;-webkit-user-select:none;border-radius:2px;padding:7px;margin:2px;vertical-align:middle;font-size:1rem;cursor:pointer}:host([disabled]){opacity:.6;pointer-events:none}:host(.outline){box-shadow:0 0 0 1px rgba(0,0,0,.1)}:host(:hover:not([disabled])){box-shadow:0 1px 0 0 rgba(0,0,0,.12),0 0 0 1px rgba(0,0,0,.1)}:host(.selected:not([disabled])){background-color:rgba(0,0,0,.05);box-shadow:inset 0 1px 0 0 rgba(0,0,0,.05),0 0 0 1px rgba(0,0,0,.12)}:host(:active:not([disabled]),.selected:active:not([disabled])){background-color:rgba(0,0,0,.05);box-shadow:inset 0 1px 0 0 rgba(0,0,0,.1),0 0 0 1px rgba(0,0,0,.12)}:host(.core-dark-theme.outline){background-color:rgba(200,200,200,.05);box-shadow:0 0 0 1px rgba(200,200,200,.1)}:host(.core-dark-theme:hover){background-color:rgba(200,200,200,.05);box-shadow:0 1px 0 0 rgba(200,200,200,.12),0 0 0 1px rgba(200,200,200,.1)}:host(.core-dark-theme.selected){background-color:rgba(220,220,220,.05);box-shadow:inset 0 1px 0 0 rgba(200,200,200,.05),0 0 0 1px rgba(200,200,200,.12)}:host(.core-dark-theme:active,.core-dark-theme.selected:active){background-color:rgba(200,200,200,.05);box-shadow:inset 0 1px 0 0 rgba(200,200,200,.1),0 0 0 1px rgba(200,200,200,.12)}core-icon{pointer-events:none}:host ::content>:not(core-icon){margin-left:4px}</style><core-icon src=\"{{src}}\" icon=\"{{icon}}\"></core-icon><content></content></template><script>Polymer(\"core-icon-button\",{src:\"\",active:false,icon:\"\",activeChanged:function(){this.classList.toggle(\"selected\",this.active)}});</script></polymer-element><polymer-element name=\"core-toolbar\" attributes=\"justify middleJustify bottomJustify\" assetpath=\"../core-toolbar/\"><template><style>:host{display:block;position:relative;box-sizing:border-box;-moz-box-sizing:border-box;height:64px;font-size:1.3em;background-color:#CFD8DC}:host(.animate){transition:height .18s ease-in}:host(.medium-tall){height:128px}:host(.tall){height:192px}.toolbar-tools{position:relative;height:64px;padding:0 8px;pointer-events:none}:host(.core-narrow),:host-context(.core-narrow){height:56px}polyfill-next-selector{content:':host.core-narrow.medium-tall, .core-narrow :host.medium-tall'}:host(.core-narrow.medium-tall),:host-context(.core-narrow):host(.medium-tall){height:112px}polyfill-next-selector{content:':host.core-narrow.tall, .core-narrow :host.tall'}:host(.core-narrow.tall),:host-context(.core-narrow):host(.tall){height:168px}polyfill-next-selector{content:':host.core-narrow .toolbar-tools, .core-narrow :host .toolbar-tools'}:host(.core-narrow) .toolbar-tools,:host-context(.core-narrow) .toolbar-tools{height:56px;padding:0}#middleBar{position:absolute;top:0;right:0;left:0}:host(.tall,.medium-tall) #middleBar{-webkit-transform:translateY(100%);transform:translateY(100%)}#bottomBar{position:absolute;right:0;bottom:0;left:0}polyfill-next-selector{content:'.toolbar-tools > *'}::content>*{pointer-events:auto}polyfill-next-selector{content:'.toolbar-tools > *'}::content>*{margin:0 8px}polyfill-next-selector{content:'.toolbar-tools > .fit'}::content>.fit{position:absolute;top:auto;right:0;bottom:0;left:0;width:auto;margin:0}polyfill-next-selector{content:':host .indent'}::content>.indent{margin-left:60px}</style><div id=\"bottomBar\" class=\"toolbar-tools\" center=\"\" horizontal=\"\" layout=\"\"><content select=\".bottom\"></content></div><div id=\"middleBar\" class=\"toolbar-tools\" center=\"\" horizontal=\"\" layout=\"\"><content select=\".middle\"></content></div><div id=\"topBar\" class=\"toolbar-tools\" center=\"\" horizontal=\"\" layout=\"\"><content></content></div></template><script>(function(){Polymer(\"core-toolbar\",{justify:\"\",middleJustify:\"\",bottomJustify:\"\",justifyChanged:function(old){this.updateBarJustify(this.$.topBar,this.justify,old)},middleJustifyChanged:function(old){this.updateBarJustify(this.$.middleBar,this.middleJustify,old)},bottomJustifyChanged:function(old){this.updateBarJustify(this.$.bottomBar,this.bottomJustify,old)},updateBarJustify:function(bar,justify,old){if(old){bar.removeAttribute(this.toLayoutAttrName(old))}if(this.justify){bar.setAttribute(this.toLayoutAttrName(justify),\"\")}},toLayoutAttrName:function(value){return value===\"between\"?\"justified\":value+\"-justified\"}})})();</script></polymer-element><polymer-element name=\"core-header-panel\" assetpath=\"../core-header-panel/\"><template><style>:host{display:block;position:relative}#outerContainer{position:absolute;top:0;right:0;bottom:0;left:0}#mainPanel{position:relative}#mainContainer{position:relative;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}#dropShadow{position:absolute;top:0;left:0;right:0;height:6px;box-shadow:inset 0 5px 6px -3px rgba(0,0,0,.4)}#dropShadow.hidden{display:none}:host([mode=scroll]) #mainContainer{overflow:visible}:host([mode=scroll]) #outerContainer{overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}:host([mode=cover]) #mainPanel{position:static}:host([mode=cover]) #mainContainer{position:absolute;top:0;right:0;bottom:0;left:0}:host([mode=cover]) #dropShadow{position:static;width:100%}</style><div id=\"outerContainer\" vertical=\"\" layout=\"\"><content id=\"headerContent\" select=\"core-toolbar, .core-header\"></content><div id=\"mainPanel\" flex=\"\" vertical=\"\" layout=\"\"><div id=\"mainContainer\" flex?=\"{{mode !== 'cover'}}\"><content id=\"mainContent\" select=\"*\"></content></div><div id=\"dropShadow\"></div></div></div></template><script>Polymer(\"core-header-panel\",{publish:{mode:{value:\"\",reflect:true},tallClass:\"tall\",shadow:false},animateDuration:200,modeConfigs:{shadowMode:{waterfall:1,\"waterfall-tall\":1},noShadow:{seamed:1,cover:1,scroll:1},tallMode:{\"waterfall-tall\":1},outerScroll:{scroll:1}},ready:function(){this.scrollHandler=this.scroll.bind(this);this.addListener()},detached:function(){this.removeListener(this.mode)},addListener:function(){this.scroller.addEventListener(\"scroll\",this.scrollHandler)},removeListener:function(mode){var s=this.getScrollerForMode(mode);s.removeEventListener(\"scroll\",this.scrollHandler)},domReady:function(){this.async(\"scroll\")},modeChanged:function(old){var header=this.header;if(header){var configs=this.modeConfigs;if(configs.tallMode[old]&&!configs.tallMode[this.mode]){header.classList.remove(this.tallClass);this.async(function(){header.classList.remove(\"animate\")},null,this.animateDuration)}else{header.classList.toggle(\"animate\",configs.tallMode[this.mode])}}if(configs&&(configs.outerScroll[this.mode]||configs.outerScroll[old])){this.removeListener(old);this.addListener()}this.scroll()},get header(){return this.$.headerContent.getDistributedNodes()[0]},getScrollerForMode:function(mode){return this.modeConfigs.outerScroll[mode]?this.$.outerContainer:this.$.mainContainer},get scroller(){return this.getScrollerForMode(this.mode)},scroll:function(){var configs=this.modeConfigs;var main=this.$.mainContainer;var header=this.header;var sTop=main.scrollTop;var atTop=sTop===0;this.$.dropShadow.classList.toggle(\"hidden\",!this.shadow&&(atTop&&configs.shadowMode[this.mode]||configs.noShadow[this.mode]));if(header&&configs.tallMode[this.mode]){header.classList.toggle(this.tallClass,atTop||header.classList.contains(this.tallClass)&&main.scrollHeight<this.$.outerContainer.offsetHeight)}this.fire(\"scroll\",{target:this.scroller},this,false)}});</script></polymer-element><script>(function(){var block={newline:/^\\n+/,code:/^( {4}[^\\n]+\\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\\n+|$)/,heading:/^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,nptable:noop,lheading:/^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,blockquote:/^( *>[^\\n]+(\\n(?!def)[^\\n]+)*\\n*)+/,list:/^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\\n{2,}|\\s*$)/,def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,table:noop,paragraph:/^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,text:/^[^\\n]+/};block.bullet=/(?:[*+-]|\\d+\\.)/;block.item=/^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/;block.item=replace(block.item,\"gm\")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)(\"hr\",\"\\\\n+(?=\\\\1?(?:[-*_] *){3,}(?:\\\\n+|$))\")(\"def\",\"\\\\n+(?=\"+block.def.source+\")\")();block.blockquote=replace(block.blockquote)(\"def\",block.def)();block._tag=\"(?!(?:\"+\"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code\"+\"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo\"+\"|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|[^\\\\w\\\\s@]*@)\\\\b\";block.html=replace(block.html)(\"comment\",/<!--[\\s\\S]*?-->/)(\"closed\",/<(tag)[\\s\\S]+?<\\/\\1>/)(\"closing\",/<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)(\"hr\",block.hr)(\"heading\",block.heading)(\"lheading\",block.lheading)(\"blockquote\",block.blockquote)(\"tag\",\"<\"+block._tag)(\"def\",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\\S+)? *\\n([\\s\\S]+?)\\s*\\1 *(?:\\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)(\"(?!\",\"(?!\"+block.gfm.fences.source.replace(\"\\\\1\",\"\\\\2\")+\"|\"+block.list.source.replace(\"\\\\1\",\"\\\\3\")+\"|\")();block.tables=merge({},block.gfm,{nptable:/^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,table:/^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\\r\\n|\\r/g,\"\\n\").replace(/\\t/g,\"    \").replace(/\\u00a0/g,\" \").replace(/\\u2424/g,\"\\n\");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,\"\"),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:\"space\"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,\"\");this.tokens.push({type:\"code\",text:!this.options.pedantic?cap.replace(/\\n+$/,\"\"):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"code\",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"heading\",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:\"table\",header:cap[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:cap[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:cap[3].replace(/\\n$/,\"\").split(\"\\n\")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]=\"right\"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]=\"center\"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]=\"left\"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].split(/ *\\| */)}this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"heading\",depth:cap[2]===\"=\"?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"hr\"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"blockquote_start\"});cap=cap[0].replace(/^ *> ?/gm,\"\");this.token(cap,top,true);this.tokens.push({type:\"blockquote_end\"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:\"list_start\",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\\d+\\.) +/,\"\");if(~item.indexOf(\"\\n \")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp(\"^ {1,\"+space+\"}\",\"gm\"),\"\"):item.replace(/^ {1,4}/gm,\"\")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+1).join(\"\\n\")+src;i=l-1}}loose=next||/\\n\\n(?!\\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)===\"\\n\";if(!loose)loose=next}this.tokens.push({type:loose?\"loose_item_start\":\"list_item_start\"});this.token(item,false,bq);this.tokens.push({type:\"list_item_end\"})}this.tokens.push({type:\"list_end\"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?\"paragraph\":\"html\",pre:cap[1]===\"pre\"||cap[1]===\"script\"||cap[1]===\"style\",text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:\"table\",header:cap[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:cap[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:cap[3].replace(/(?: *\\| *)?\\n$/,\"\").split(\"\\n\")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]=\"right\"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]=\"center\"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]=\"left\"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].replace(/^ *\\| *| *\\| *$/g,\"\").split(/ *\\| */)}this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:\"paragraph\",text:cap[1].charAt(cap[1].length-1)===\"\\n\"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:\"text\",text:cap[0]});continue}if(src){throw new Error(\"Infinite loop on byte: \"+src.charCodeAt(0))}}return this.tokens};var inline={escape:/^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,autolink:/^<([^ >]+(@|:\\/)[^ >]+)>/,url:noop,tag:/^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,link:/^!?\\[(inside)\\]\\(href\\)/,reflink:/^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,nolink:/^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,strong:/^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,em:/^\\b_((?:__|[\\s\\S])+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,code:/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,br:/^ {2,}\\n(?!\\s*$)/,del:noop,text:/^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/};inline._inside=/(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/;inline._href=/\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/;inline.link=replace(inline.link)(\"inside\",inline._inside)(\"href\",inline._href)();inline.reflink=replace(inline.reflink)(\"inside\",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,em:/^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)(\"])\",\"~|])\")(),url:/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,del:/^~~(?=\\S)([\\s\\S]*?\\S)~~/,text:replace(inline.text)(\"]|\",\"~]|\")(\"|\",\"|https?://|\")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)(\"{2,}\",\"*\")(),text:replace(inline.gfm.text)(\"{2,}\",\"*\")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error(\"Tokens array requires a `links` property.\")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out=\"\",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]===\"@\"){text=cap[1].charAt(6)===\":\"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle(\"mailto:\")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^<a /i.test(cap[0])){this.inLink=true}else if(this.inLink&&/^<\\/a>/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\\s+/g,\" \");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(this.smartypants(cap[0]));continue}if(src){throw new Error(\"Infinite loop on byte: \"+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!==\"!\"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,\"—\").replace(/(^|[-\\u2014/(\\[{\"\\s])'/g,\"$1‘\").replace(/'/g,\"’\").replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g,\"$1“\").replace(/\"/g,\"”\").replace(/\\.{3}/g,\"…\")};InlineLexer.prototype.mangle=function(text){var out=\"\",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>.5){ch=\"x\"+ch.toString(16)}out+=\"&#\"+ch+\";\"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return\"<pre><code>\"+(escaped?code:escape(code,true))+\"\\n</code></pre>\"}return'<pre><code class=\"'+this.options.langPrefix+escape(lang,true)+'\">'+(escaped?code:escape(code,true))+\"\\n</code></pre>\\n\"};Renderer.prototype.blockquote=function(quote){return\"<blockquote>\\n\"+quote+\"</blockquote>\\n\"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return\"<h\"+level+' id=\"'+this.options.headerPrefix+raw.toLowerCase().replace(/[^\\w]+/g,\"-\")+'\">'+text+\"</h\"+level+\">\\n\"};Renderer.prototype.hr=function(){return this.options.xhtml?\"<hr/>\\n\":\"<hr>\\n\"};Renderer.prototype.list=function(body,ordered){var type=ordered?\"ol\":\"ul\";return\"<\"+type+\">\\n\"+body+\"</\"+type+\">\\n\"};Renderer.prototype.listitem=function(text){return\"<li>\"+text+\"</li>\\n\"};Renderer.prototype.paragraph=function(text){return\"<p>\"+text+\"</p>\\n\"};Renderer.prototype.table=function(header,body){return\"<table>\\n\"+\"<thead>\\n\"+header+\"</thead>\\n\"+\"<tbody>\\n\"+body+\"</tbody>\\n\"+\"</table>\\n\"};Renderer.prototype.tablerow=function(content){return\"<tr>\\n\"+content+\"</tr>\\n\"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?\"th\":\"td\";var tag=flags.align?\"<\"+type+' style=\"text-align:'+flags.align+'\">':\"<\"+type+\">\";return tag+content+\"</\"+type+\">\\n\"};Renderer.prototype.strong=function(text){return\"<strong>\"+text+\"</strong>\"};Renderer.prototype.em=function(text){return\"<em>\"+text+\"</em>\"};Renderer.prototype.codespan=function(text){return\"<code>\"+text+\"</code>\"};Renderer.prototype.br=function(){return this.options.xhtml?\"<br/>\":\"<br>\"};Renderer.prototype.del=function(text){return\"<del>\"+text+\"</del>\"};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\\w:]/g,\"\").toLowerCase()}catch(e){return\"\"}if(prot.indexOf(\"javascript:\")===0){return\"\"}}var out='<a href=\"'+href+'\"';if(title){out+=' title=\"'+title+'\"'}out+=\">\"+text+\"</a>\";return out};Renderer.prototype.image=function(href,title,text){var out='<img src=\"'+href+'\" alt=\"'+text+'\"';if(title){out+=' title=\"'+title+'\"'}out+=this.options.xhtml?\"/>\":\">\";return out};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out=\"\";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type===\"text\"){body+=\"\\n\"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case\"space\":{return\"\"}case\"hr\":{return this.renderer.hr()}case\"heading\":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case\"code\":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case\"table\":{var header=\"\",body=\"\",i,row,cell,flags,j;cell=\"\";for(i=0;i<this.token.header.length;i++){flags={header:true,align:this.token.align[i]};cell+=this.renderer.tablecell(this.inline.output(this.token.header[i]),{header:true,align:this.token.align[i]})}header+=this.renderer.tablerow(cell);for(i=0;i<this.token.cells.length;i++){row=this.token.cells[i];cell=\"\";for(j=0;j<row.length;j++){cell+=this.renderer.tablecell(this.inline.output(row[j]),{header:false,align:this.token.align[j]})}body+=this.renderer.tablerow(cell)}return this.renderer.table(header,body)}case\"blockquote_start\":{var body=\"\";while(this.next().type!==\"blockquote_end\"){body+=this.tok()}return this.renderer.blockquote(body)}case\"list_start\":{var body=\"\",ordered=this.token.ordered;while(this.next().type!==\"list_end\"){body+=this.tok()}return this.renderer.list(body,ordered)}case\"list_item_start\":{var body=\"\";while(this.next().type!==\"list_item_end\"){body+=this.token.type===\"text\"?this.parseText():this.tok()}return this.renderer.listitem(body)}case\"loose_item_start\":{var body=\"\";while(this.next().type!==\"list_item_end\"){body+=this.tok()}return this.renderer.listitem(body)}case\"html\":{var html=!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;return this.renderer.html(html)}case\"paragraph\":{return this.renderer.paragraph(this.inline.output(this.token.text))}case\"text\":{return this.renderer.paragraph(this.parseText())}}};function escape(html,encode){return html.replace(!encode?/&(?!#?\\w+;)/g:/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}function unescape(html){return html.replace(/&([#\\w]+);/g,function(_,n){n=n.toLowerCase();if(n===\"colon\")return\":\";if(n.charAt(0)===\"#\"){return n.charAt(1)===\"x\"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return\"\"})}function replace(regex,opt){regex=regex.source;opt=opt||\"\";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\\[])\\^/g,\"$1\");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target){if(Object.prototype.hasOwnProperty.call(target,key)){obj[key]=target[key]}}}return obj}function marked(src,opt,callback){if(callback||typeof opt===\"function\"){if(!callback){callback=opt;opt=null}opt=merge({},marked.defaults,opt||{});var highlight=opt.highlight,tokens,pending,i=0;try{tokens=Lexer.lex(src,opt)}catch(e){return callback(e)}pending=tokens.length;var done=function(){var out,err;try{out=Parser.parse(tokens,opt)}catch(e){err=e}opt.highlight=highlight;return err?callback(err):callback(null,out)};if(!highlight||highlight.length<3){return done()}delete opt.highlight;if(!pending)return done();for(;i<tokens.length;i++){(function(token){if(token.type!==\"code\"){return--pending||done()}return highlight(token.text,token.lang,function(err,code){if(code==null||code===token.text){return--pending||done()}token.text=code;token.escaped=true;--pending||done()})})(tokens[i])}return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+=\"\\nPlease report this to https://github.com/chjj/marked.\";if((opt||marked.defaults).silent){return\"<p>An error occured:</p><pre>\"+escape(e.message+\"\",true)+\"</pre>\"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:\"lang-\",smartypants:false,headerPrefix:\"\",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof exports===\"object\"){module.exports=marked}else if(typeof define===\"function\"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!==\"undefined\"?window:global)}());</script><polymer-element name=\"marked-element\" attributes=\"text\" assetpath=\"../marked-element/\"><script>Polymer(\"marked-element\",{text:\"\",attached:function(){marked.setOptions({highlight:this.highlight.bind(this)});if(!this.text){this.text=this.innerHTML}},textChanged:function(oldVal,newVal){if(newVal){this.innerHTML=marked(this.text)}},highlight:function(code,lang){var event=this.fire(\"marked-js-highlight\",{code:code,lang:lang});return event.detail.code||code}});</script></polymer-element><script>var IN_GLOBAL_SCOPE=true;window[\"PR_SHOULD_USE_CONTINUATION\"]=true;var prettyPrintOne;var prettyPrint;(function(){var win=window;var FLOW_CONTROL_KEYWORDS=[\"break,continue,do,else,for,if,return,while\"];var C_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"auto,case,char,const,default,\"+\"double,enum,extern,float,goto,inline,int,long,register,short,signed,\"+\"sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"];var COMMON_KEYWORDS=[C_KEYWORDS,\"catch,class,delete,false,import,\"+\"new,operator,private,protected,public,this,throw,true,try,typeof\"];var CPP_KEYWORDS=[COMMON_KEYWORDS,\"alignof,align_union,asm,axiom,bool,\"+\"concept,concept_map,const_cast,constexpr,decltype,delegate,\"+\"dynamic_cast,explicit,export,friend,generic,late_check,\"+\"mutable,namespace,nullptr,property,reinterpret_cast,static_assert,\"+\"static_cast,template,typeid,typename,using,virtual,where\"];var JAVA_KEYWORDS=[COMMON_KEYWORDS,\"abstract,assert,boolean,byte,extends,final,finally,implements,import,\"+\"instanceof,interface,null,native,package,strictfp,super,synchronized,\"+\"throws,transient\"];var CSHARP_KEYWORDS=[JAVA_KEYWORDS,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,\"+\"fixed,foreach,from,group,implicit,in,internal,into,is,let,\"+\"lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,\"+\"sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,\"+\"var,virtual,where\"];var COFFEE_KEYWORDS=\"all,and,by,catch,class,else,extends,false,finally,\"+\"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,\"+\"throw,true,try,unless,until,when,while,yes\";var JSCRIPT_KEYWORDS=[COMMON_KEYWORDS,\"debugger,eval,export,function,get,null,set,undefined,var,with,\"+\"Infinity,NaN\"];var PERL_KEYWORDS=\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,\"+\"goto,if,import,last,local,my,next,no,our,print,package,redo,require,\"+\"sub,undef,unless,until,use,wantarray,while,BEGIN,END\";var PYTHON_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"and,as,assert,class,def,del,\"+\"elif,except,exec,finally,from,global,import,in,is,lambda,\"+\"nonlocal,not,or,pass,print,raise,try,with,yield,\"+\"False,True,None\"];var RUBY_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"alias,and,begin,case,class,\"+\"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,\"+\"rescue,retry,self,super,then,true,undef,unless,until,when,yield,\"+\"BEGIN,END\"];var RUST_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"as,assert,const,copy,drop,\"+\"enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,\"+\"pub,pure,ref,self,static,struct,true,trait,type,unsafe,use\"];var SH_KEYWORDS=[FLOW_CONTROL_KEYWORDS,\"case,done,elif,esac,eval,fi,\"+\"function,in,local,set,then,until\"];var ALL_KEYWORDS=[CPP_KEYWORDS,CSHARP_KEYWORDS,JSCRIPT_KEYWORDS,PERL_KEYWORDS,PYTHON_KEYWORDS,RUBY_KEYWORDS,SH_KEYWORDS];var C_TYPES=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/;var PR_STRING=\"str\";var PR_KEYWORD=\"kwd\";var PR_COMMENT=\"com\";var PR_TYPE=\"typ\";var PR_LITERAL=\"lit\";var PR_PUNCTUATION=\"pun\";var PR_PLAIN=\"pln\";var PR_TAG=\"tag\";var PR_DECLARATION=\"dec\";var PR_SOURCE=\"src\";var PR_ATTRIB_NAME=\"atn\";var PR_ATTRIB_VALUE=\"atv\";var PR_NOCODE=\"nocode\";var REGEXP_PRECEDER_PATTERN=\"(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<<?=?|>>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*\";function combinePrefixPatterns(regexs){var capturedGroupIndex=0;var needToFoldCase=false;var ignoreCase=false;for(var i=0,n=regexs.length;i<n;++i){var regex=regexs[i];if(regex.ignoreCase){ignoreCase=true}else if(/[a-z]/i.test(regex.source.replace(/\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi,\"\"))){needToFoldCase=true;ignoreCase=false;break}}var escapeCharToCodeUnit={b:8,t:9,n:10,v:11,f:12,r:13};function decodeEscape(charsetPart){var cc0=charsetPart.charCodeAt(0);if(cc0!==92){return cc0}var c1=charsetPart.charAt(1);cc0=escapeCharToCodeUnit[c1];if(cc0){return cc0}else if(\"0\"<=c1&&c1<=\"7\"){return parseInt(charsetPart.substring(1),8)}else if(c1===\"u\"||c1===\"x\"){return parseInt(charsetPart.substring(2),16)}else{return charsetPart.charCodeAt(1)}}function encodeEscape(charCode){if(charCode<32){return(charCode<16?\"\\\\x0\":\"\\\\x\")+charCode.toString(16)}var ch=String.fromCharCode(charCode);return ch===\"\\\\\"||ch===\"-\"||ch===\"]\"||ch===\"^\"?\"\\\\\"+ch:ch}function caseFoldCharset(charSet){var charsetParts=charSet.substring(1,charSet.length-1).match(new RegExp(\"\\\\\\\\u[0-9A-Fa-f]{4}\"+\"|\\\\\\\\x[0-9A-Fa-f]{2}\"+\"|\\\\\\\\[0-3][0-7]{0,2}\"+\"|\\\\\\\\[0-7]{1,2}\"+\"|\\\\\\\\[\\\\s\\\\S]\"+\"|-\"+\"|[^-\\\\\\\\]\",\"g\"));var ranges=[];var inverse=charsetParts[0]===\"^\";var out=[\"[\"];if(inverse){out.push(\"^\")}for(var i=inverse?1:0,n=charsetParts.length;i<n;++i){var p=charsetParts[i];if(/\\\\[bdsw]/i.test(p)){out.push(p)}else{var start=decodeEscape(p);var end;if(i+2<n&&\"-\"===charsetParts[i+1]){end=decodeEscape(charsetParts[i+2]);i+=2}else{end=start}ranges.push([start,end]);if(!(end<65||start>122)){if(!(end<65||start>90)){ranges.push([Math.max(65,start)|32,Math.min(end,90)|32])}if(!(end<97||start>122)){ranges.push([Math.max(97,start)&~32,Math.min(end,122)&~32])}}}}ranges.sort(function(a,b){return a[0]-b[0]||b[1]-a[1]});var consolidatedRanges=[];var lastRange=[];for(var i=0;i<ranges.length;++i){var range=ranges[i];if(range[0]<=lastRange[1]+1){lastRange[1]=Math.max(lastRange[1],range[1])}else{consolidatedRanges.push(lastRange=range)}}for(var i=0;i<consolidatedRanges.length;++i){var range=consolidatedRanges[i];out.push(encodeEscape(range[0]));if(range[1]>range[0]){if(range[1]+1>range[0]){out.push(\"-\")}out.push(encodeEscape(range[1]))}}out.push(\"]\");return out.join(\"\")}function allowAnywhereFoldCaseAndRenumberGroups(regex){var parts=regex.source.match(new RegExp(\"(?:\"+\"\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]\"+\"|\\\\\\\\u[A-Fa-f0-9]{4}\"+\"|\\\\\\\\x[A-Fa-f0-9]{2}\"+\"|\\\\\\\\[0-9]+\"+\"|\\\\\\\\[^ux0-9]\"+\"|\\\\(\\\\?[:!=]\"+\"|[\\\\(\\\\)\\\\^]\"+\"|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+\"+\")\",\"g\"));var n=parts.length;var capturedGroups=[];for(var i=0,groupIndex=0;i<n;++i){var p=parts[i];if(p===\"(\"){++groupIndex}else if(\"\\\\\"===p.charAt(0)){var decimalValue=+p.substring(1);if(decimalValue){if(decimalValue<=groupIndex){capturedGroups[decimalValue]=-1}else{parts[i]=encodeEscape(decimalValue)}}}}for(var i=1;i<capturedGroups.length;++i){if(-1===capturedGroups[i]){capturedGroups[i]=++capturedGroupIndex}}for(var i=0,groupIndex=0;i<n;++i){var p=parts[i];if(p===\"(\"){++groupIndex;if(!capturedGroups[groupIndex]){parts[i]=\"(?:\"}}else if(\"\\\\\"===p.charAt(0)){var decimalValue=+p.substring(1);if(decimalValue&&decimalValue<=groupIndex){parts[i]=\"\\\\\"+capturedGroups[decimalValue]}}}for(var i=0;i<n;++i){if(\"^\"===parts[i]&&\"^\"!==parts[i+1]){parts[i]=\"\"}}if(regex.ignoreCase&&needToFoldCase){for(var i=0;i<n;++i){var p=parts[i];var ch0=p.charAt(0);if(p.length>=2&&ch0===\"[\"){parts[i]=caseFoldCharset(p)}else if(ch0!==\"\\\\\"){parts[i]=p.replace(/[a-zA-Z]/g,function(ch){var cc=ch.charCodeAt(0);return\"[\"+String.fromCharCode(cc&~32,cc|32)+\"]\"})}}}return parts.join(\"\")}var rewritten=[];for(var i=0,n=regexs.length;i<n;++i){var regex=regexs[i];if(regex.global||regex.multiline){throw new Error(\"\"+regex)}rewritten.push(\"(?:\"+allowAnywhereFoldCaseAndRenumberGroups(regex)+\")\")}return new RegExp(rewritten.join(\"|\"),ignoreCase?\"gi\":\"g\")}function extractSourceSpans(node,isPreformatted){var nocode=/(?:^|\\s)nocode(?:\\s|$)/;var chunks=[];var length=0;var spans=[];var k=0;function walk(node){var type=node.nodeType;if(type==1){if(nocode.test(node.className)){return}for(var child=node.firstChild;child;child=child.nextSibling){walk(child)}var nodeName=node.nodeName.toLowerCase();if(\"br\"===nodeName||\"li\"===nodeName){chunks[k]=\"\\n\";spans[k<<1]=length++;spans[k++<<1|1]=node}}else if(type==3||type==4){var text=node.nodeValue;if(text.length){if(!isPreformatted){text=text.replace(/[ \\t\\r\\n]+/g,\" \")}else{text=text.replace(/\\r\\n?/g,\"\\n\")}chunks[k]=text;spans[k<<1]=length;length+=text.length;spans[k++<<1|1]=node}}}walk(node);return{sourceCode:chunks.join(\"\").replace(/\\n$/,\"\"),spans:spans}}function appendDecorations(basePos,sourceCode,langHandler,out){if(!sourceCode){return}var job={sourceCode:sourceCode,basePos:basePos};langHandler(job);out.push.apply(out,job.decorations)}var notWs=/\\S/;function childContentWrapper(element){var wrapper=undefined;for(var c=element.firstChild;c;c=c.nextSibling){var type=c.nodeType;wrapper=type===1?wrapper?element:c:type===3?notWs.test(c.nodeValue)?element:wrapper:wrapper}return wrapper===element?undefined:wrapper}function createSimpleLexer(shortcutStylePatterns,fallthroughStylePatterns){var shortcuts={};var tokenizer;(function(){var allPatterns=shortcutStylePatterns.concat(fallthroughStylePatterns);var allRegexs=[];var regexKeys={};for(var i=0,n=allPatterns.length;i<n;++i){var patternParts=allPatterns[i];var shortcutChars=patternParts[3];if(shortcutChars){for(var c=shortcutChars.length;--c>=0;){shortcuts[shortcutChars.charAt(c)]=patternParts}}var regex=patternParts[1];var k=\"\"+regex;if(!regexKeys.hasOwnProperty(k)){allRegexs.push(regex);regexKeys[k]=null}}allRegexs.push(/[\\0-\\uffff]/);tokenizer=combinePrefixPatterns(allRegexs)})();var nPatterns=fallthroughStylePatterns.length;var decorate=function(job){var sourceCode=job.sourceCode,basePos=job.basePos;var decorations=[basePos,PR_PLAIN];var pos=0;var tokens=sourceCode.match(tokenizer)||[];var styleCache={};for(var ti=0,nTokens=tokens.length;ti<nTokens;++ti){var token=tokens[ti];var style=styleCache[token];var match=void 0;var isEmbedded;if(typeof style===\"string\"){isEmbedded=false}else{var patternParts=shortcuts[token.charAt(0)];if(patternParts){match=token.match(patternParts[1]);style=patternParts[0]}else{for(var i=0;i<nPatterns;++i){patternParts=fallthroughStylePatterns[i];match=token.match(patternParts[1]);if(match){style=patternParts[0];break}}if(!match){style=PR_PLAIN}}isEmbedded=style.length>=5&&\"lang-\"===style.substring(0,5);if(isEmbedded&&!(match&&typeof match[1]===\"string\")){isEmbedded=false;style=PR_SOURCE}if(!isEmbedded){styleCache[token]=style}}var tokenStart=pos;pos+=token.length;if(!isEmbedded){decorations.push(basePos+tokenStart,style)}else{var embeddedSource=match[1];var embeddedSourceStart=token.indexOf(embeddedSource);var embeddedSourceEnd=embeddedSourceStart+embeddedSource.length;if(match[2]){embeddedSourceEnd=token.length-match[2].length;embeddedSourceStart=embeddedSourceEnd-embeddedSource.length}var lang=style.substring(5);appendDecorations(basePos+tokenStart,token.substring(0,embeddedSourceStart),decorate,decorations);appendDecorations(basePos+tokenStart+embeddedSourceStart,embeddedSource,langHandlerForExtension(lang,embeddedSource),decorations);appendDecorations(basePos+tokenStart+embeddedSourceEnd,token.substring(embeddedSourceEnd),decorate,decorations)}}job.decorations=decorations};return decorate}function sourceDecorator(options){var shortcutStylePatterns=[],fallthroughStylePatterns=[];if(options[\"tripleQuotedStrings\"]){shortcutStylePatterns.push([PR_STRING,/^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,null,\"'\\\"\"])}else if(options[\"multiLineStrings\"]){shortcutStylePatterns.push([PR_STRING,/^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,null,\"'\\\"`\"])}else{shortcutStylePatterns.push([PR_STRING,/^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,null,\"\\\"'\"])}if(options[\"verbatimStrings\"]){fallthroughStylePatterns.push([PR_STRING,/^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/,null])}var hc=options[\"hashComments\"];if(hc){if(options[\"cStyleComments\"]){if(hc>1){shortcutStylePatterns.push([PR_COMMENT,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,\"#\"])}else{shortcutStylePatterns.push([PR_COMMENT,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,null,\"#\"])}fallthroughStylePatterns.push([PR_STRING,/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,null])}else{shortcutStylePatterns.push([PR_COMMENT,/^#[^\\r\\n]*/,null,\"#\"])}}if(options[\"cStyleComments\"]){fallthroughStylePatterns.push([PR_COMMENT,/^\\/\\/[^\\r\\n]*/,null]);fallthroughStylePatterns.push([PR_COMMENT,/^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,null])}var regexLiterals=options[\"regexLiterals\"];if(regexLiterals){var regexExcls=regexLiterals>1?\"\":\"\\n\\r\";var regexAny=regexExcls?\".\":\"[\\\\S\\\\s]\";var REGEX_LITERAL=\"/(?=[^/*\"+regexExcls+\"])\"+\"(?:[^/\\\\x5B\\\\x5C\"+regexExcls+\"]\"+\"|\\\\x5C\"+regexAny+\"|\\\\x5B(?:[^\\\\x5C\\\\x5D\"+regexExcls+\"]\"+\"|\\\\x5C\"+regexAny+\")*(?:\\\\x5D|$))+\"+\"/\";fallthroughStylePatterns.push([\"lang-regex\",RegExp(\"^\"+REGEXP_PRECEDER_PATTERN+\"(\"+REGEX_LITERAL+\")\")])}var types=options[\"types\"];if(types){fallthroughStylePatterns.push([PR_TYPE,types])}var keywords=(\"\"+options[\"keywords\"]).replace(/^ | $/g,\"\");if(keywords.length){fallthroughStylePatterns.push([PR_KEYWORD,new RegExp(\"^(?:\"+keywords.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),null])}shortcutStylePatterns.push([PR_PLAIN,/^\\s+/,null,\" \\r\\n\t \"]);var punctuation=\"^.[^\\\\s\\\\w.$@'\\\"`/\\\\\\\\]*\";if(options[\"regexLiterals\"]){punctuation+=\"(?!s*/)\"}fallthroughStylePatterns.push([PR_LITERAL,/^@[a-z_$][a-z_$@0-9]*/i,null],[PR_TYPE,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/,null],[PR_PLAIN,/^[a-z_$][a-z_$@0-9]*/i,null],[PR_LITERAL,new RegExp(\"^(?:\"+\"0x[a-f0-9]+\"+\"|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)\"+\"(?:e[+\\\\-]?\\\\d+)?\"+\")\"+\"[a-z]*\",\"i\"),null,\"0123456789\"],[PR_PLAIN,/^\\\\[\\s\\S]?/,null],[PR_PUNCTUATION,new RegExp(punctuation),null]);return createSimpleLexer(shortcutStylePatterns,fallthroughStylePatterns)}var decorateSource=sourceDecorator({keywords:ALL_KEYWORDS,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function numberLines(node,opt_startLineNum,isPreformatted){var nocode=/(?:^|\\s)nocode(?:\\s|$)/;var lineBreak=/\\r\\n?|\\n/;var document=node.ownerDocument;var li=document.createElement(\"li\");while(node.firstChild){li.appendChild(node.firstChild)}var listItems=[li];function walk(node){var type=node.nodeType;if(type==1&&!nocode.test(node.className)){if(\"br\"===node.nodeName){breakAfter(node);if(node.parentNode){node.parentNode.removeChild(node)}}else{for(var child=node.firstChild;child;child=child.nextSibling){walk(child)}}}else if((type==3||type==4)&&isPreformatted){var text=node.nodeValue;var match=text.match(lineBreak);if(match){var firstLine=text.substring(0,match.index);node.nodeValue=firstLine;var tail=text.substring(match.index+match[0].length);if(tail){var parent=node.parentNode;parent.insertBefore(document.createTextNode(tail),node.nextSibling)}breakAfter(node);if(!firstLine){node.parentNode.removeChild(node)}}}}function breakAfter(lineEndNode){while(!lineEndNode.nextSibling){lineEndNode=lineEndNode.parentNode;if(!lineEndNode){return}}function breakLeftOf(limit,copy){var rightSide=copy?limit.cloneNode(false):limit;var parent=limit.parentNode;if(parent){var parentClone=breakLeftOf(parent,1);var next=limit.nextSibling;parentClone.appendChild(rightSide);for(var sibling=next;sibling;sibling=next){next=sibling.nextSibling;parentClone.appendChild(sibling)}}return rightSide}var copiedListItem=breakLeftOf(lineEndNode.nextSibling,0);for(var parent;(parent=copiedListItem.parentNode)&&parent.nodeType===1;){copiedListItem=parent}listItems.push(copiedListItem)}for(var i=0;i<listItems.length;++i){walk(listItems[i])}if(opt_startLineNum===(opt_startLineNum|0)){listItems[0].setAttribute(\"value\",opt_startLineNum)}var ol=document.createElement(\"ol\");ol.className=\"linenums\";var offset=Math.max(0,opt_startLineNum-1|0)||0;for(var i=0,n=listItems.length;i<n;++i){li=listItems[i];li.className=\"L\"+(i+offset)%10;if(!li.firstChild){li.appendChild(document.createTextNode(\" \"))}ol.appendChild(li)}node.appendChild(ol)}function recombineTagsAndDecorations(job){var isIE8OrEarlier=/\\bMSIE\\s(\\d+)/.exec(navigator.userAgent);isIE8OrEarlier=isIE8OrEarlier&&+isIE8OrEarlier[1]<=8;var newlineRe=/\\n/g;var source=job.sourceCode;var sourceLength=source.length;var sourceIndex=0;var spans=job.spans;var nSpans=spans.length;var spanIndex=0;var decorations=job.decorations;var nDecorations=decorations.length;var decorationIndex=0;decorations[nDecorations]=sourceLength;var decPos,i;for(i=decPos=0;i<nDecorations;){if(decorations[i]!==decorations[i+2]){decorations[decPos++]=decorations[i++];decorations[decPos++]=decorations[i++]}else{i+=2}}nDecorations=decPos;for(i=decPos=0;i<nDecorations;){var startPos=decorations[i];var startDec=decorations[i+1];var end=i+2;while(end+2<=nDecorations&&decorations[end+1]===startDec){end+=2}decorations[decPos++]=startPos;decorations[decPos++]=startDec;i=end}nDecorations=decorations.length=decPos;var sourceNode=job.sourceNode;var oldDisplay;if(sourceNode){oldDisplay=sourceNode.style.display;sourceNode.style.display=\"none\"}try{var decoration=null;while(spanIndex<nSpans){var spanStart=spans[spanIndex];var spanEnd=spans[spanIndex+2]||sourceLength;var decEnd=decorations[decorationIndex+2]||sourceLength;var end=Math.min(spanEnd,decEnd);var textNode=spans[spanIndex+1];var styledText;if(textNode.nodeType!==1&&(styledText=source.substring(sourceIndex,end))){if(isIE8OrEarlier){styledText=styledText.replace(newlineRe,\"\\r\")}textNode.nodeValue=styledText;var document=textNode.ownerDocument;var span=document.createElement(\"span\");span.className=decorations[decorationIndex+1];var parentNode=textNode.parentNode;parentNode.replaceChild(span,textNode);span.appendChild(textNode);if(sourceIndex<spanEnd){spans[spanIndex+1]=textNode=document.createTextNode(source.substring(end,spanEnd));parentNode.insertBefore(textNode,span.nextSibling)}}sourceIndex=end;if(sourceIndex>=spanEnd){spanIndex+=2}if(sourceIndex>=decEnd){decorationIndex+=2}}}finally{if(sourceNode){sourceNode.style.display=oldDisplay}}}var langHandlerRegistry={};function registerLangHandler(handler,fileExtensions){for(var i=fileExtensions.length;--i>=0;){var ext=fileExtensions[i];if(!langHandlerRegistry.hasOwnProperty(ext)){langHandlerRegistry[ext]=handler}else if(win[\"console\"]){console[\"warn\"](\"cannot override language handler %s\",ext)}}}function langHandlerForExtension(extension,source){if(!(extension&&langHandlerRegistry.hasOwnProperty(extension))){extension=/^\\s*</.test(source)?\"default-markup\":\"default-code\"}return langHandlerRegistry[extension]}registerLangHandler(decorateSource,[\"default-code\"]);registerLangHandler(createSimpleLexer([],[[PR_PLAIN,/^[^<?]+/],[PR_DECLARATION,/^<!\\w[^>]*(?:>|$)/],[PR_COMMENT,/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);registerLangHandler(createSimpleLexer([[PR_PLAIN,/^[\\s]+/,null,\" \t\\r\\n\"],[PR_ATTRIB_VALUE,/^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/,null,\"\\\"'\"]],[[PR_TAG,/^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],[PR_ATTRIB_NAME,/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],[PR_PUNCTUATION,/^[=<>\\/]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],[\"lang-css\",/^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-css\",/^style\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-css\",/^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]]),[\"in.tag\"]);registerLangHandler(createSimpleLexer([],[[PR_ATTRIB_VALUE,/^[\\s\\S]+/]]),[\"uq.val\"]);registerLangHandler(sourceDecorator({keywords:CPP_KEYWORDS,hashComments:true,cStyleComments:true,types:C_TYPES}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);registerLangHandler(sourceDecorator({keywords:\"null,true,false\"}),[\"json\"]);registerLangHandler(sourceDecorator({keywords:CSHARP_KEYWORDS,hashComments:true,cStyleComments:true,verbatimStrings:true,types:C_TYPES}),[\"cs\"]);registerLangHandler(sourceDecorator({keywords:JAVA_KEYWORDS,cStyleComments:true}),[\"java\"]);registerLangHandler(sourceDecorator({keywords:SH_KEYWORDS,hashComments:true,multiLineStrings:true}),[\"bash\",\"bsh\",\"csh\",\"sh\"]);registerLangHandler(sourceDecorator({keywords:PYTHON_KEYWORDS,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),[\"cv\",\"py\",\"python\"]);registerLangHandler(sourceDecorator({keywords:PERL_KEYWORDS,hashComments:true,multiLineStrings:true,regexLiterals:2}),[\"perl\",\"pl\",\"pm\"]);registerLangHandler(sourceDecorator({keywords:RUBY_KEYWORDS,hashComments:true,multiLineStrings:true,regexLiterals:true}),[\"rb\",\"ruby\"]);registerLangHandler(sourceDecorator({keywords:JSCRIPT_KEYWORDS,cStyleComments:true,regexLiterals:true}),[\"javascript\",\"js\"]);registerLangHandler(sourceDecorator({keywords:COFFEE_KEYWORDS,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),[\"coffee\"]);registerLangHandler(sourceDecorator({keywords:RUST_KEYWORDS,cStyleComments:true,multilineStrings:true}),[\"rc\",\"rs\",\"rust\"]);registerLangHandler(createSimpleLexer([],[[PR_STRING,/^[\\s\\S]+/]]),[\"regex\"]);function applyDecorator(job){var opt_langExtension=job.langExtension;try{var sourceAndSpans=extractSourceSpans(job.sourceNode,job.pre);var source=sourceAndSpans.sourceCode;job.sourceCode=source;job.spans=sourceAndSpans.spans;job.basePos=0;langHandlerForExtension(opt_langExtension,source)(job);recombineTagsAndDecorations(job)}catch(e){if(win[\"console\"]){console[\"log\"](e&&e[\"stack\"]||e)}}}function $prettyPrintOne(sourceCodeHtml,opt_langExtension,opt_numberLines){var container=document.createElement(\"div\");container.innerHTML=\"<pre>\"+sourceCodeHtml+\"</pre>\";container=container.firstChild;if(opt_numberLines){numberLines(container,opt_numberLines,true)}var job={langExtension:opt_langExtension,numberLines:opt_numberLines,sourceNode:container,pre:1};applyDecorator(job);return container.innerHTML}function $prettyPrint(opt_whenDone,opt_root){var root=opt_root||document.body;var doc=root.ownerDocument||document;function byTagName(tn){return root.getElementsByTagName(tn)}var codeSegments=[byTagName(\"pre\"),byTagName(\"code\"),byTagName(\"xmp\")];var elements=[];for(var i=0;i<codeSegments.length;++i){for(var j=0,n=codeSegments[i].length;j<n;++j){elements.push(codeSegments[i][j])}}codeSegments=null;var clock=Date;if(!clock[\"now\"]){clock={now:function(){return+new Date}}}var k=0;var prettyPrintingJob;var langExtensionRe=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;var prettyPrintRe=/\\bprettyprint\\b/;var prettyPrintedRe=/\\bprettyprinted\\b/;var preformattedTagNameRe=/pre|xmp/i;var codeRe=/^code$/i;var preCodeXmpRe=/^(?:pre|code|xmp)$/i;var EMPTY={};function doWork(){var endTime=win[\"PR_SHOULD_USE_CONTINUATION\"]?clock[\"now\"]()+250:Infinity;for(;k<elements.length&&clock[\"now\"]()<endTime;k++){var cs=elements[k];var attrs=EMPTY;{for(var preceder=cs;preceder=preceder.previousSibling;){var nt=preceder.nodeType;var value=(nt===7||nt===8)&&preceder.nodeValue;if(value?!/^\\??prettify\\b/.test(value):nt!==3||/\\S/.test(preceder.nodeValue)){break}if(value){attrs={};value.replace(/\\b(\\w+)=([\\w:.%+-]+)/g,function(_,name,value){attrs[name]=value});break}}}var className=cs.className;if((attrs!==EMPTY||prettyPrintRe.test(className))&&!prettyPrintedRe.test(className)){var nested=false;for(var p=cs.parentNode;p;p=p.parentNode){var tn=p.tagName;if(preCodeXmpRe.test(tn)&&p.className&&prettyPrintRe.test(p.className)){nested=true;break}}if(!nested){cs.className+=\" prettyprinted\";var langExtension=attrs[\"lang\"];if(!langExtension){langExtension=className.match(langExtensionRe);var wrapper;if(!langExtension&&(wrapper=childContentWrapper(cs))&&codeRe.test(wrapper.tagName)){langExtension=wrapper.className.match(langExtensionRe)}if(langExtension){langExtension=langExtension[1]}}var preformatted;if(preformattedTagNameRe.test(cs.tagName)){preformatted=1}else{var currentStyle=cs[\"currentStyle\"];var defaultView=doc.defaultView;var whitespace=currentStyle?currentStyle[\"whiteSpace\"]:defaultView&&defaultView.getComputedStyle?defaultView.getComputedStyle(cs,null).getPropertyValue(\"white-space\"):0;preformatted=whitespace&&\"pre\"===whitespace.substring(0,3)}var lineNums=attrs[\"linenums\"];if(!(lineNums=lineNums===\"true\"||+lineNums)){lineNums=className.match(/\\blinenums\\b(?::(\\d+))?/);lineNums=lineNums?lineNums[1]&&lineNums[1].length?+lineNums[1]:true:false}if(lineNums){numberLines(cs,lineNums,preformatted)}prettyPrintingJob={langExtension:langExtension,sourceNode:cs,numberLines:lineNums,pre:preformatted};applyDecorator(prettyPrintingJob)}}}if(k<elements.length){setTimeout(doWork,250)}else if(\"function\"===typeof opt_whenDone){opt_whenDone()}}doWork()}var PR=win[\"PR\"]={createSimpleLexer:createSimpleLexer,registerLangHandler:registerLangHandler,sourceDecorator:sourceDecorator,PR_ATTRIB_NAME:PR_ATTRIB_NAME,PR_ATTRIB_VALUE:PR_ATTRIB_VALUE,PR_COMMENT:PR_COMMENT,PR_DECLARATION:PR_DECLARATION,PR_KEYWORD:PR_KEYWORD,PR_LITERAL:PR_LITERAL,PR_NOCODE:PR_NOCODE,PR_PLAIN:PR_PLAIN,PR_PUNCTUATION:PR_PUNCTUATION,PR_SOURCE:PR_SOURCE,PR_STRING:PR_STRING,PR_TAG:PR_TAG,PR_TYPE:PR_TYPE,prettyPrintOne:IN_GLOBAL_SCOPE?win[\"prettyPrintOne\"]=$prettyPrintOne:prettyPrintOne=$prettyPrintOne,prettyPrint:prettyPrint=IN_GLOBAL_SCOPE?win[\"prettyPrint\"]=$prettyPrint:prettyPrint=$prettyPrint};if(typeof define===\"function\"&&define[\"amd\"]){define(\"google-code-prettify\",[],function(){return PR})}})();</script><script>(function(scope){var ContextFreeParser={parse:function(text){var top={};var entities=[];var current=top;var subCurrent={};var scriptDocCommentClause=\"\\\\/\\\\*\\\\*([\\\\s\\\\S]*?)\\\\*\\\\/\";var htmlDocCommentClause=\"<!--([\\\\s\\\\S]*?)-->\";var docCommentRegex=new RegExp(scriptDocCommentClause+\"|\"+htmlDocCommentClause,\"g\");var docComments=text.match(docCommentRegex)||[];docComments.forEach(function(m){var lines=m.replace(/\\r\\n/g,\"\\n\").replace(/^\\s*\\/\\*\\*|^\\s*\\*\\/|^\\s*\\* ?|^\\s*\\<\\!-\\-|^s*\\-\\-\\>/gm,\"\").split(\"\\n\");var pragmas=[];lines=lines.filter(function(l){var m=l.match(/\\s*@([\\w-]*) (.*)/);if(!m){return true}pragmas.push(m)});var code=lines.join(\"\\n\");pragmas.forEach(function(m){var pragma=m[1],content=m[2];switch(pragma){case\"class\":case\"element\":current={name:content,description:code};entities.push(current);break;case\"attribute\":case\"property\":case\"method\":case\"event\":subCurrent={name:content,description:code};var label=pragma==\"property\"?\"properties\":pragma+\"s\";makePragma(current,label,subCurrent);break;case\"default\":case\"type\":subCurrent[pragma]=content;break;case\"param\":var eventParmsRe=/\\{(.+)\\}\\s+(\\w+[.\\w+]+)\\s+(.*)$/;var params=content.match(eventParmsRe);if(params){var subEventObj={type:params[1],name:params[2],description:params[3]};makePragma(subCurrent,pragma+\"s\",subEventObj)}break;default:current[pragma]=content;break}});function makePragma(object,pragma,content){var p$=object;var p=p$[pragma];if(!p){p$[pragma]=p=[]}p.push(content)}});if(entities.length===0){entities.push({name:\"Entity\",description:\"**Undocumented**\"})}return entities}};if(typeof module!==\"undefined\"&&module.exports){module.exports=ContextFreeParser}else{scope.ContextFreeParser=ContextFreeParser}})(this);</script><polymer-element name=\"core-xhr\" hidden assetpath=\"../core-ajax/\"><script>Polymer(\"core-xhr\",{request:function(options){var xhr=new XMLHttpRequest;var url=options.url;var method=options.method||\"GET\";var async=!options.sync;var params=this.toQueryString(options.params);if(params&&method==\"GET\"){url+=(url.indexOf(\"?\")>0?\"&\":\"?\")+params}var xhrParams=this.isBodyMethod(method)?options.body||params:null;xhr.open(method,url,async);if(options.responseType){xhr.responseType=options.responseType}if(options.withCredentials){xhr.withCredentials=true}this.makeReadyStateHandler(xhr,options.callback);this.setRequestHeaders(xhr,options.headers);xhr.send(xhrParams);if(!async){xhr.onreadystatechange(xhr)}return xhr},toQueryString:function(params){var r=[];for(var n in params){var v=params[n];n=encodeURIComponent(n);r.push(v==null?n:n+\"=\"+encodeURIComponent(v))}return r.join(\"&\")},isBodyMethod:function(method){return this.bodyMethods[(method||\"\").toUpperCase()]},bodyMethods:{POST:1,PUT:1,DELETE:1},makeReadyStateHandler:function(xhr,callback){xhr.onreadystatechange=function(){if(xhr.readyState==4){callback&&callback.call(null,xhr.response,xhr)}}},setRequestHeaders:function(xhr,headers){if(headers){for(var name in headers){xhr.setRequestHeader(name,headers[name])}}}});</script></polymer-element><polymer-element name=\"core-ajax\" hidden attributes=\"url handleAs auto params response error method headers body contentType withCredentials\" assetpath=\"../core-ajax/\"><script>Polymer(\"core-ajax\",{url:\"\",handleAs:\"\",auto:false,params:\"\",response:null,error:null,method:\"\",headers:null,body:null,contentType:\"application/x-www-form-urlencoded\",withCredentials:false,xhrArgs:null,ready:function(){this.xhr=document.createElement(\"core-xhr\")},receive:function(response,xhr){if(this.isSuccess(xhr)){this.processResponse(xhr)}else{this.processError(xhr)}this.complete(xhr)},isSuccess:function(xhr){var status=xhr.status||0;return!status||status>=200&&status<300},processResponse:function(xhr){var response=this.evalResponse(xhr);if(xhr===this.activeRequest){this.response=response}this.fire(\"core-response\",{response:response,xhr:xhr})},processError:function(xhr){var response=xhr.status+\": \"+xhr.responseText;if(xhr===this.activeRequest){this.error=response}this.fire(\"core-error\",{response:response,xhr:xhr})},complete:function(xhr){this.fire(\"core-complete\",{response:xhr.status,xhr:xhr})},evalResponse:function(xhr){return this[(this.handleAs||\"text\")+\"Handler\"](xhr)},xmlHandler:function(xhr){return xhr.responseXML},textHandler:function(xhr){return xhr.responseText},jsonHandler:function(xhr){var r=xhr.responseText;try{return JSON.parse(r)}catch(x){console.warn(\"core-ajax caught an exception trying to parse response as JSON:\");console.warn(\"url:\",this.url);console.warn(x);return r}},documentHandler:function(xhr){return xhr.response},blobHandler:function(xhr){return xhr.response},arraybufferHandler:function(xhr){return xhr.response},urlChanged:function(){if(!this.handleAs){var ext=String(this.url).split(\".\").pop();switch(ext){case\"json\":this.handleAs=\"json\";break}}this.autoGo()},paramsChanged:function(){this.autoGo()},autoChanged:function(){this.autoGo()},autoGo:function(){if(this.auto){this.goJob=this.job(this.goJob,this.go,0)}},go:function(){var args=this.xhrArgs||{};args.body=this.body||args.body;args.params=this.params||args.params;if(args.params&&typeof args.params==\"string\"){args.params=JSON.parse(args.params)}args.headers=this.headers||args.headers||{};if(args.headers&&typeof args.headers==\"string\"){args.headers=JSON.parse(args.headers)}var hasContentType=Object.keys(args.headers).some(function(header){return header.toLowerCase()===\"content-type\"});if(!hasContentType&&this.contentType){args.headers[\"Content-Type\"]=this.contentType}if(this.handleAs===\"arraybuffer\"||this.handleAs===\"blob\"||this.handleAs===\"document\"){args.responseType=this.handleAs}args.withCredentials=this.withCredentials;args.callback=this.receive.bind(this);args.url=this.url;args.method=this.method;this.response=this.error=null;this.activeRequest=args.url&&this.xhr.request(args);return this.activeRequest}});</script></polymer-element><polymer-element name=\"context-free-parser\" attributes=\"url text data\" assetpath=\"../context-free-parser/\"><template><core-ajax url=\"{{url}}\" response=\"{{text}}\" auto=\"\"></core-ajax></template><script>Polymer(\"context-free-parser\",{text:null,textChanged:function(){if(this.text){var entities=ContextFreeParser.parse(this.text);if(!entities||entities.length===0){entities=[{name:this.url.split(\"/\").pop(),description:\"**Undocumented**\"}]}this.data={classes:entities}}},dataChanged:function(){this.fire(\"data-ready\")}});</script></polymer-element><polymer-element name=\"core-doc-page\" attributes=\"data\" relative=\"\" assetpath=\"../core-doc-viewer/elements/\"><template><style>:host{display:block}#info>*{margin-right:20px}core-icon{margin-right:5px}.main{padding:0 72px;max-width:832px;margin:0 auto}marked-element{display:block}h1{color:#E91E63;font-size:52px;line-height:60px;font-weight:inherit}.box{margin-bottom:40px}.box:not(.top) .details{padding:16px}.box:not(.top) .details .params{margin-top:40px}.box:not(.top) h3{padding:16px;color:#fff;font-weight:inherit;font-size:20px;line-height:48px;margin:0}.box:not(.top) pre{padding:initial;background-color:transparent;margin:initial;font-size:12px}.box code{color:currentcolor;font-weight:500}.top pre{background-color:#fafafa;padding:16px}pre{max-width:832px;white-space:pre-wrap;overflow:hidden;border:none}.attribute-box .details{background-color:#ffcbbb;border-bottom:1px solid rgba(255,86,33,.5)}.attribute-box h3{background-color:#ff5621}.property-box .details{background-color:#fbe7b1;border-bottom:1px solid rgba(243,179,0,.5)}.property-box h3{background-color:#f3b300}.method-box .details{background-color:#a6ffea;border-bottom:1px solid rgba(0,190,164,.5)}.method-box h3{background-color:#00bea4}.event-box .details{background-color:#c5d9fb;border-bottom:1px solid rgba(65,132,243,.5)}.event-box h3{background-color:#4184f3}.badge{color:currentcolor}code,pre{color:#9f499b;font-family:\"Source Code Pro\",Monaco,Menlo,Consolas,\"Courier New\",monospace}pre .typ,pre .inline,.prettyprint .typ,.prettyprint .inline{color:#6b499f}pre .pun,.prettyprint .pun{color:#5c6bc0}pre .str,pre .string,.prettyprint .str,.prettyprint .string{color:#ff4081}pre .pln,.prettyprint .pln{color:#7986cb}pre .kwd,.prettyprint .kwd{color:#d61a7f}pre .atn,pre .attribute-name,.prettyprint .atn,.prettyprint .attribute-name{color:#6b499f}pre .atv,pre .attribute-value,.prettyprint .atv,.prettyprint .attribute-value{color:#7986cb}pre .com,pre .comment,.prettyprint .com,.prettyprint .comment{color:#8a8a8a}</style><core-header-panel id=\"panel\" mode=\"waterfall\" fit=\"\"><div class=\"main\" on-marked-js-highlight=\"{{hilight}}\"><h1>{{data.name}}</h1><p id=\"info\" layout=\"\" horizontal=\"\" center=\"\"><span layout=\"\" horizontal=\"\" center=\"\"><core-icon icon=\"home\"></core-icon><a href=\"{{data | homepageFilter}}\">Home Page</a></span><span layout=\"\" horizontal=\"\" center=\"\" hidden?=\"{{!data.version}}\"><core-icon icon=\"info-outline\"></core-icon>Version: {{data.version}}</span></p><template if=\"{{data.extends}}\"><section class=\"top\"><h3 id=\"{{data.name}}.extends\">Extends: <a href=\"#{{data.extends}}\">{{data.extends}}</a></h3></section></template><template if=\"{{data.description}}\"><section class=\"box top\"><h3 id=\"{{data.name}}.summary\">Summary</h3><marked-element text=\"{{data.description}}\"></marked-element></section></template><template if=\"{{data.attributes.length}}\"><section class=\"box attribute-box\"><h3 id=\"{{data.name}}.attributes\">Attributes</h3><template repeat=\"{{attribute in data.attributes}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.attributes.{{attribute.name}}\"><p><code>{{attribute.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><p layout=\"\" horizontal=\"\" center=\"\" justified=\"\"><code>&lt;<em>{{attribute.type}}</em>&gt;</code><span class=\"default\" hidden?=\"{{!attribute.default}}\">default: <code>{{attribute.default}}</code></span></p><marked-element text=\"{{attribute.description}}\"></marked-element></div></div></template></section></template><template if=\"{{data.properties.length}}\"><section class=\"box property-box\"><h3 id=\"{{data.name}}.properties\">Properties</h3><template repeat=\"{{property in data.properties}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.properties.{{property.name}}\"><p><code>{{property.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><p layout=\"\" horizontal=\"\" center=\"\" justified=\"\"><code>&lt;<em>{{property.type}}</em>&gt;</code><span class=\"default\" hidden?=\"{{!property.default}}\">default: <code>{{property.default}}</code></span></p><marked-element text=\"{{property.description}}\"></marked-element></div></div></template></section></template><template if=\"{{data.events.length}}\"><section class=\"box event-box\"><h3 id=\"{{data.name}}.events\">Events</h3><template repeat=\"{{event in data.events}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.events.{{event.name}}\"><p><code>{{event.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><marked-element text=\"{{event.description}}\"></marked-element><template if=\"{{event.params.length}}\"><div class=\"params\"><p>Event details:</p><template repeat=\"{{param in event.params}}\"><p><code>&lt;<em>{{param.type}}</em>&gt; {{param.name}}</code></p><p><span>{{param.description}}</span></p></template></div></template></div></div></template></section></template><template if=\"{{data.methods.length}}\"><section class=\"box method-box\"><h3 id=\"{{data.name}}.methods\">Methods</h3><template repeat=\"{{method in data.methods}}\"><div class=\"details\" horizontal=\"\" layout=\"\"><div class=\"details-name\" flex=\"\" id=\"{{data.name}}.methods.{{method.name}}\"><p><code>{{method.name}}</code></p></div><div class=\"details-info\" flex=\"\" three=\"\"><marked-element text=\"{{method.description}}\"></marked-element><template if=\"{{method.params.length}}\"><div class=\"params\"><p>Method parameters:</p><template repeat=\"{{param in method.params}}\"><p><code>&lt;<em>{{param.type}}</em>&gt; {{param.name}}</code></p><p><span>{{param.description}}</span></p></template></div></template></div></div></template></section></template></div></core-header-panel></template><script>Polymer(\"core-doc-page\",{hilight:function(event,detail,sender){detail.code=prettyPrintOne((detail.code||\"\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\"))},homepageFilter:function(data){if(!data){return\"\"}if(!data.homepage||data.homepage===\"github.io\"){return\"//polymer.github.io/\"+data.name}else{return data.homepage}},dataChanged:function(){this.async(function(){var elementToFocus=this.shadowRoot.getElementById(window.location.hash.slice(1));if(elementToFocus){elementToFocus.scrollIntoView()}})}});</script></polymer-element><polymer-element name=\"core-selection\" attributes=\"multi\" hidden assetpath=\"../core-selection/\"><script>Polymer(\"core-selection\",{multi:false,ready:function(){this.clear()},clear:function(){this.selection=[]},getSelection:function(){return this.multi?this.selection:this.selection[0]},isSelected:function(item){return this.selection.indexOf(item)>=0},setItemSelected:function(item,isSelected){if(item!==undefined&&item!==null){if(isSelected){this.selection.push(item)}else{var i=this.selection.indexOf(item);if(i>=0){this.selection.splice(i,1)}}this.fire(\"core-select\",{isSelected:isSelected,item:item})}},select:function(item){if(this.multi){this.toggle(item)}else if(this.getSelection()!==item){this.setItemSelected(this.getSelection(),false);this.setItemSelected(item,true)}},toggle:function(item){this.setItemSelected(item,!this.isSelected(item))}});</script></polymer-element><polymer-element name=\"core-selector\" attributes=\"selected multi valueattr selectedClass selectedProperty selectedAttribute selectedItem selectedModel selectedIndex notap excludedLocalNames target itemsSelector activateEvent\" assetpath=\"../core-selector/\"><template><core-selection id=\"selection\" multi=\"{{multi}}\" on-core-select=\"{{selectionSelect}}\"></core-selection><content id=\"items\" select=\"*\"></content></template><script>Polymer(\"core-selector\",{selected:null,multi:false,valueattr:\"name\",selectedClass:\"core-selected\",selectedProperty:\"\",selectedAttribute:\"active\",selectedItem:null,selectedModel:null,selectedIndex:-1,excludedLocalNames:\"\",target:null,itemsSelector:\"\",activateEvent:\"tap\",notap:false,defaultExcludedLocalNames:\"template\",observe:{\"selected multi\":\"selectedChanged\"},ready:function(){this.activateListener=this.activateHandler.bind(this);this.itemFilter=this.filterItem.bind(this);this.excludedLocalNamesChanged();this.observer=new MutationObserver(this.updateSelected.bind(this));if(!this.target){this.target=this}},get items(){if(!this.target){return[]}var nodes=this.target!==this?this.itemsSelector?this.target.querySelectorAll(this.itemsSelector):this.target.children:this.$.items.getDistributedNodes();return Array.prototype.filter.call(nodes,this.itemFilter)},filterItem:function(node){return!this._excludedNames[node.localName]},excludedLocalNamesChanged:function(){this._excludedNames={};var s=this.defaultExcludedLocalNames;if(this.excludedLocalNames){s+=\" \"+this.excludedLocalNames}s.split(/\\s+/g).forEach(function(n){this._excludedNames[n]=1},this)},targetChanged:function(old){if(old){this.removeListener(old);this.observer.disconnect();this.clearSelection()}if(this.target){this.addListener(this.target);this.observer.observe(this.target,{childList:true});this.updateSelected()}},addListener:function(node){Polymer.addEventListener(node,this.activateEvent,this.activateListener)},removeListener:function(node){Polymer.removeEventListener(node,this.activateEvent,this.activateListener)},get selection(){return this.$.selection.getSelection()},selectedChanged:function(){if(arguments.length===1){this.processSplices(arguments[0])}else{this.updateSelected()}},updateSelected:function(){this.validateSelected();if(this.multi){this.clearSelection(this.selected);this.selected&&this.selected.forEach(function(s){this.setValueSelected(s,true)},this)}else{this.valueToSelection(this.selected)}},validateSelected:function(){if(this.multi&&!Array.isArray(this.selected)&&this.selected!=null){this.selected=[this.selected]}else if(!this.multi&&Array.isArray(this.selected)){var s=this.selected[0];this.clearSelection([s]);this.selected=s}},processSplices:function(splices){for(var i=0,splice;splice=splices[i];i++){for(var j=0;j<splice.removed.length;j++){this.setValueSelected(splice.removed[j],false)}for(var j=0;j<splice.addedCount;j++){this.setValueSelected(this.selected[splice.index+j],true)}}},clearSelection:function(excludes){this.$.selection.selection.slice().forEach(function(item){var v=this.valueForNode(item)||this.items.indexOf(item);if(!excludes||excludes.indexOf(v)<0){this.$.selection.setItemSelected(item,false)}},this)},valueToSelection:function(value){var item=this.valueToItem(value);this.$.selection.select(item)},setValueSelected:function(value,isSelected){var item=this.valueToItem(value);if(isSelected^this.$.selection.isSelected(item)){this.$.selection.setItemSelected(item,isSelected)}},updateSelectedItem:function(){this.selectedItem=this.selection},selectedItemChanged:function(){if(this.selectedItem){var t=this.selectedItem.templateInstance;this.selectedModel=t?t.model:undefined}else{this.selectedModel=null}this.selectedIndex=this.selectedItem?parseInt(this.valueToIndex(this.selected)):-1},valueToItem:function(value){return value===null||value===undefined?null:this.items[this.valueToIndex(value)]},valueToIndex:function(value){for(var i=0,items=this.items,c;c=items[i];i++){if(this.valueForNode(c)==value){return i}}return value},valueForNode:function(node){return node[this.valueattr]||node.getAttribute(this.valueattr)},selectionSelect:function(e,detail){this.updateSelectedItem();if(detail.item){this.applySelection(detail.item,detail.isSelected)}},applySelection:function(item,isSelected){if(this.selectedClass){item.classList.toggle(this.selectedClass,isSelected)}if(this.selectedProperty){item[this.selectedProperty]=isSelected}if(this.selectedAttribute&&item.setAttribute){if(isSelected){item.setAttribute(this.selectedAttribute,\"\")}else{item.removeAttribute(this.selectedAttribute)}}},activateHandler:function(e){if(!this.notap){var i=this.findDistributedTarget(e.target,this.items);if(i>=0){var item=this.items[i];var s=this.valueForNode(item)||i;if(this.multi){if(this.selected){this.addRemoveSelected(s)}else{this.selected=[s]}}else{this.selected=s}this.asyncFire(\"core-activate\",{item:item})}}},addRemoveSelected:function(value){var i=this.selected.indexOf(value);if(i>=0){this.selected.splice(i,1)}else{this.selected.push(value)}},findDistributedTarget:function(target,nodes){while(target&&target!=this){var i=Array.prototype.indexOf.call(nodes,target);if(i>=0){return i}target=target.parentNode}},selectIndex:function(index){var item=this.items[index];if(item){this.selected=this.valueForNode(item)||index;return item}},selectPrevious:function(wrapped){var i=wrapped&&!this.selectedIndex?this.items.length-1:this.selectedIndex-1;return this.selectIndex(i)},selectNext:function(wrapped){var i=wrapped&&this.selectedIndex>=this.items.length-1?0:this.selectedIndex+1;return this.selectIndex(i)}});</script></polymer-element><polymer-element name=\"core-menu\" extends=\"core-selector\" assetpath=\"../core-menu/\"><template><style>:host{display:block;margin:12px}polyfill-next-selector{content:':host > core-item'}::content>core-item{cursor:default}</style><shadow></shadow></template><script>Polymer(\"core-menu\");</script></polymer-element><polymer-element name=\"core-item\" attributes=\"label icon src\" horizontal=\"\" center=\"\" layout=\"\" assetpath=\"../core-item/\"><template><style>:host{display:block;position:relative;min-height:40px;white-space:nowrap}:host(.font-scalable){min-height:2.5em}:host(.core-selected){font-weight:700}#icon{margin:0 16px 0 4px}:host(.font-scalable) #icon{margin:0 1em 0 .25em;height:1.5em;width:1.5em}polyfill-next-selector{content:':host > a'}::content>a{position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.000001)}</style><template if=\"{{icon || src}}\"><core-icon src=\"{{src}}\" id=\"icon\" icon=\"{{icon}}\" hidden?=\"{{!src && !icon}}\"></core-icon></template><div id=\"label\">{{label}}</div><content></content></template><script>Polymer(\"core-item\",{});</script></polymer-element><polymer-element name=\"core-doc-toc\" attributes=\"data selected\" assetpath=\"../core-doc-viewer/elements/\"><template><style>:host{display:block;position:relative;border-right:1px solid silver}core-header-panel{position:absolute;top:0;left:0;height:100%;width:100%}core-toolbar{background-color:#eee}</style><core-header-panel mode=\"waterfall\"><core-menu selected=\"{{selected}}\"><template repeat=\"{{data}}\"><core-item><a href=\"#{{name}}\">{{name}}</a></core-item></template></core-menu></core-header-panel></template><script>Polymer(\"core-doc-toc\",{searchAction:function(){this.$.searchBar.style.opacity=1;this.$.searchBar.style.display=\"\"},closeSearchAction:function(){this.$.searchBar.style.opacity=0;this.$.searchBar.style.display=\"none\"}});</script></polymer-element><polymer-element name=\"core-doc-viewer\" attributes=\"sources route url\" horizontal=\"\" layout=\"\" assetpath=\"../core-doc-viewer/\"><template><style>core-doc-toc{display:none;width:332px;overflow-x:hidden}</style><context-free-parser url=\"{{url}}\" on-data-ready=\"{{parserDataReady}}\"></context-free-parser><template repeat=\"{{sources}}\"><context-free-parser url=\"{{}}\" on-data-ready=\"{{parserDataReady}}\"></context-free-parser></template><core-doc-toc id=\"toc\" data=\"{{classes}}\" selected=\"{{selected}}\"></core-doc-toc><core-doc-page flex=\"\" data=\"{{data}}\"></core-doc-page></template><script>Polymer(\"core-doc-viewer\",{classes:[],sources:[],ready:function(){window.addEventListener(\"hashchange\",this.parseLocationHash.bind(this));this.parseLocationHash()},parseLocationHash:function(){this.route=window.location.hash.slice(1)},routeChanged:function(){this.validateRoute()},validateRoute:function(){if(this.route){this.classes.some(function(c){if(c.name===this.route.split(\".\")[0]){this.data=c;this.route=\"\";return}},this)}},selectedChanged:function(){this.data=this.classes[this.selected]},parserDataReady:function(event,detail,sender){var path=\"\";if(this.sources.length){var path=event.target.templateInstance.model;var idx=path.lastIndexOf(\"/\");path=idx!=-1?path.substr(0,idx):\".\"}else{var parts=location.pathname.split(\"/\");parts.pop();path=parts.join(\"/\")}var data=event.target.data;var xhr=new XMLHttpRequest;xhr.open(\"GET\",path+\"/bower.json\");xhr.onerror=function(e){this.assimilateData(data)}.bind(this);xhr.onloadend=function(e){if(e.target.status==200){var version=JSON.parse(e.target.response).version;for(var i=0,c;c=data.classes[i];++i){c.version=version}}this.assimilateData(data)}.bind(this);xhr.send()},assimilateData:function(data){this.classes=this.classes.concat(data.classes);this.classes.sort(function(a,b){var na=a&&a.name.toLowerCase(),nb=b&&b.name.toLowerCase();return na<nb?-1:na==nb?0:1});if(!this.data&&!this.route&&this.classes.length){this.data=this.classes[0]}if(this.classes.length>1){this.$.toc.style.display=\"block\"}this.validateRoute()}});</script></polymer-element></div>\n<div hidden>undefined</div>\n\n<!--\n\nImplements the default landing page for Polymer components.\n\n`<core-component-page>` can render an information page for any component.\nPolymer components use this component in `index.html` to provide the standard landing page.\n\n`<core-component-page>` is _vulcanized_, which means it contains all it's dependencies baked in.\nTherefore, this component is intended to be used only by itself in a page.\n\nThis *-dev package contains the raw source and the dependency manifest necessary\nto reconstruct `core-component-page/core-component-page.html` via vulcanize. To vulcanize,\ncheck out the core-component-page repo alongside this repo and run build.sh. This will\ndrop the vulcanize output into `core-component-page/core-component-page.html`.\n\nNote: `<core-component-page>` sets the page title automatically.\n\n@group Polymer Core Elements\n@element core-component-page\n\n-->\n\n<polymer-element name=\"core-component-page\" attributes=\"moduleName sources\" layout=\"\" vertical=\"\" assetpath=\"../core-component-page-dev/\"><template><style>:host{font-family:Arial,sans-serif;height:100vh}h2{display:inline-block;margin:8px 6px;vertical-align:middle}.choiceB,.choiceC,.choiceD{color:#fff;font-size:12px;font-weight:700;text-decoration:none;background-color:#4285F4;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);box-shadow:0 0 1px 0 rgba(0,0,0,.1);border-radius:2px;cursor:pointer;display:inline-block;padding:4px 12px 5px 12px;margin:4px 0}.appbar{background-color:#E91E63;color:#fff}</style><core-toolbar class=\"appbar\"><span>{{moduleName}}</span><a class=\"choiceC\" target=\"_blank\" href=\"../{{moduleName}}/demo.html\">demo</a></core-toolbar><core-doc-viewer flex=\"\" url=\"{{url}}\" sources=\"{{sources}}\"></core-doc-viewer></template><script>Polymer(\"core-component-page\",{moduleName:\"\",sources:[],ready:function(){this.moduleName=this.moduleName||this.findModuleName()},moduleNameChanged:function(){document.title=this.moduleName;this.url=!this.sources.length&&this.moduleName?this.moduleName+\".html\":\"\"},findModuleName:function(){var path=location.pathname.split(\"/\");var name=path.pop()||path.pop();if(name.indexOf(\".html\")>=0){name=path.pop()}return name||\"\"}});</script></polymer-element>\n"
  },
  {
    "path": "src/mui/bower_components/core-component-page/demo.html",
    "content": "<!doctype html>\r\n<!--\r\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\r\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\r\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\r\nCode distributed by Google as part of the polymer project is also\r\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\r\n-->\r\n<html>\r\n<head>\r\n\r\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\r\n  <link rel=\"import\" href=\"../polymer/polymer.html\">\r\n  <link rel=\"import\" href=\"core-component-page.html\">\r\n\r\n</head>\r\n<body unresolved>\r\n\r\n  <core-component-page></core-component-page>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "src/mui/bower_components/core-component-page/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-icon/.bower.json",
    "content": "{\n  \"name\": \"core-icon\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-iconset\": \"Polymer/core-iconset#^0.5.0\",\n    \"core-icons\": \"Polymer/core-icons#^0.5.0\"\n  },\n  \"version\": \"0.5.2\",\n  \"homepage\": \"https://github.com/Polymer/core-icon\",\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"4b6ec20167ad5c176c403ee4ca2387f73dd11532\"\n  },\n  \"_source\": \"git://github.com/Polymer/core-icon.git\",\n  \"_target\": \"~0.5.2\",\n  \"_originalSource\": \"Polymer/core-icon\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-icon/README.md",
    "content": "core-icon\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-icon) for more information.\n"
  },
  {
    "path": "src/mui/bower_components/core-icon/bower.json",
    "content": "{\n  \"name\": \"core-icon\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-iconset\": \"Polymer/core-iconset#^0.5.0\",\n    \"core-icons\": \"Polymer/core-icons#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-icon/core-icon.css",
    "content": "/* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */\n\nhtml /deep/ core-icon {\n  display: inline-block;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n  fill: currentcolor;\n  position: relative;\n  height: 24px;\n  width: 24px;\n}"
  },
  {
    "path": "src/mui/bower_components/core-icon/core-icon.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<!--\n\nThe `core-icon` element displays an icon. By default an icon renders as a 24px square.\n\nExample using src:\n\n    <core-icon src=\"star.png\"></core-icon>\n\nExample setting size to 32px x 32px:\n\n    <core-icon class=\"big\" src=\"big_star.png\"></core-icon>\n\n    <style>\n      .big {\n        height: 32px;\n        width: 32px;\n      }\n    </style>\n\nThe core elements include several sets of icons. \nTo use the default set of icons, import  `core-icons.html` and use the `icon` attribute to specify an icon:\n\n    &lt;!-- import default iconset and core-icon --&gt;\n    <link rel=\"import\" href=\"/components/core-icons/core-icons.html\">\n\n    <core-icon icon=\"menu\"></core-icon>\n    \nTo use a different built-in set of icons, import  `core-icons/<iconset>-icons.html`, and\nspecify the icon as `<iconset>:<icon>`. For example:\n\n    &lt;!-- import communication iconset and core-icon --&gt;\n    <link rel=\"import\" href=\"/components/core-icons/communication-icons.html\">\n\n    <core-icon icon=\"communication:email\"></core-icon>\n    \nYou can also create custom icon sets of bitmap or SVG icons. \n\nExample of using an icon named `cherry` from a custom iconset with the ID `fruit`:\n\n    <core-icon icon=\"fruit:cherry\"></core-icon>\n\nSee [core-iconset](#core-iconset) and [core-iconset-svg](#core-iconset-svg) for more information about\nhow to create a custom iconset.\n\nSee [core-icons](http://www.polymer-project.org/components/core-icons/demo.html) for the default set of icons.\n\n@group Polymer Core Elements\n@element core-icon\n@homepage polymer.github.io\n-->\n<link rel=\"import\" href=\"../core-iconset/core-iconset.html\">\n\n<link rel=\"stylesheet\" href=\"core-icon.css\" shim-shadowdom>\n\n<polymer-element name=\"core-icon\" attributes=\"src icon alt\">\n<script>\n(function() {\n  \n  // mono-state\n  var meta;\n  \n  Polymer('core-icon', {\n\n    /**\n     * The URL of an image for the icon. If the src property is specified,\n     * the icon property should not be.\n     *\n     * @attribute src\n     * @type string\n     * @default ''\n     */\n    src: '',\n\n    /**\n     * Specifies the icon name or index in the set of icons available in\n     * the icon's icon set. If the icon property is specified,\n     * the src property should not be.\n     *\n     * @attribute icon\n     * @type string\n     * @default ''\n     */\n    icon: '',\n\n    /**\n     * Alternative text content for accessibility support.\n     * If alt is present and not empty, it will set the element's role to img and add an aria-label whose content matches alt.\n     * If alt is present and is an empty string, '', it will hide the element from the accessibility layer\n     * If alt is not present, it will set the element's role to img and the element will fallback to using the icon attribute for its aria-label.\n     * \n     * @attribute alt\n     * @type string\n     * @default ''\n     */\n    alt: null,\n\n    observe: {\n      'icon': 'updateIcon',\n      'alt': 'updateAlt'\n    },\n\n    defaultIconset: 'icons',\n\n    ready: function() {\n      if (!meta) {\n        meta = document.createElement('core-iconset');\n      }\n\n      // Allow user-provided `aria-label` in preference to any other text alternative.\n      if (this.hasAttribute('aria-label')) {\n        // Set `role` if it has not been overridden.\n        if (!this.hasAttribute('role')) {\n          this.setAttribute('role', 'img');\n        }\n        return;\n      }\n      this.updateAlt();\n    },\n\n    srcChanged: function() {\n      var icon = this._icon || document.createElement('div');\n      icon.textContent = '';\n      icon.setAttribute('fit', '');\n      icon.style.backgroundImage = 'url(' + this.src + ')';\n      icon.style.backgroundPosition = 'center';\n      icon.style.backgroundSize = '100%';\n      if (!icon.parentNode) {\n        this.appendChild(icon);\n      }\n      this._icon = icon;\n    },\n\n    getIconset: function(name) {\n      return meta.byId(name || this.defaultIconset);\n    },\n\n    updateIcon: function(oldVal, newVal) {\n      if (!this.icon) {\n        this.updateAlt();\n        return;\n      }\n      var parts = String(this.icon).split(':');\n      var icon = parts.pop();\n      if (icon) {\n        var set = this.getIconset(parts.pop());\n        if (set) {\n          this._icon = set.applyIcon(this, icon);\n          if (this._icon) {\n            this._icon.setAttribute('fit', '');\n          }\n        }\n      }\n      // Check to see if we're using the old icon's name for our a11y fallback\n      if (oldVal) {\n        if (oldVal.split(':').pop() == this.getAttribute('aria-label')) {\n          this.updateAlt();\n        }\n      }\n    },\n\n    updateAlt: function() {\n      // Respect the user's decision to remove this element from\n      // the a11y tree\n      if (this.getAttribute('aria-hidden')) {\n        return;\n      }\n\n      // Remove element from a11y tree if `alt` is empty, otherwise\n      // use `alt` as `aria-label`.\n      if (this.alt === '') {\n        this.setAttribute('aria-hidden', 'true');\n        if (this.hasAttribute('role')) {\n          this.removeAttribute('role');\n        }\n        if (this.hasAttribute('aria-label')) {\n          this.removeAttribute('aria-label');\n        }\n      } else {\n        this.setAttribute('aria-label', this.alt ||\n                                        this.icon.split(':').pop());\n        if (!this.hasAttribute('role')) {\n          this.setAttribute('role', 'img');\n        }\n        if (this.hasAttribute('aria-hidden')) {\n          this.removeAttribute('aria-hidden');\n        }\n      }\n    }\n\n  });\n  \n})();\n</script>\n\n</polymer-element>\n"
  },
  {
    "path": "src/mui/bower_components/core-icon/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<html>\n<head>\n  <title>core-icon</title>\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-icons/core-icons.html\">\n  <link rel=\"import\" href=\"core-icon.html\">\n  \n  <style>\n    segment {\n      min-width: 200px;\n    }\n\n    core-icon.big {\n      height: 128px;\n      width: 128px;\n    }\n  </style>\n</head>\n<body unresolved>\n\n<template is=\"auto-binding\">\n  <div wrap horizontal layout>\n    <template repeat=\"{{icon in $.meta.metaData.icons.iconNames}}\">\n      <segment><core-icon icon=\"{{icon}}\"></core-icon> {{icon}}</segment>\n    </template>\n  </div>\n  <core-iconset id=\"meta\"></core-iconset>\n  <div hidden?=\"{{!$.meta.metaData.icons.iconNames}}\">\n    Sized icon:\n    <core-icon class=\"big\" icon=\"accessibility\"></core-icon>\n  </div>\n</template>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-icon/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-icon/metadata.html",
    "content": "<!--\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-->\n<x-meta id=\"core-icon\" label=\"Icon\" group=\"Core\" hideSubtree>\n\n  <template>\n    <core-icon icon=\"search\"></core-icon>\n  </template>\n\n  <template id=\"imports\">\n    <link rel=\"import\" href=\"../core-icons/core-icons.html\">\n    <link rel=\"import\" href=\"core-icon.html\">\n  </template>\n\n</x-meta>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/.bower.json",
    "content": "{\n  \"name\": \"core-icons\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-icon\": \"Polymer/core-icon#^0.5.0\",\n    \"core-iconset-svg\": \"Polymer/core-iconset-svg#^0.5.0\",\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\",\n  \"homepage\": \"https://github.com/Polymer/core-icons\",\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"d08341261f7b386fb331b1dd798fcd71727e7c85\"\n  },\n  \"_source\": \"git://github.com/Polymer/core-icons.git\",\n  \"_target\": \"^0.5.0\",\n  \"_originalSource\": \"Polymer/core-icons\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-icons/README.md",
    "content": "core-icons\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-icons) for more information.\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/av-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"av\" iconSize=\"24\">\n<svg><defs>\n<g id=\"album\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14.5c-2.49 0-4.5-2.01-4.5-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-5.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z\"/></g>\n<g id=\"artist\"><path d=\"M11 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm7.5-2v5.22c-.31-.14-.64-.22-1-.22-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5 2.5-1.12 2.5-2.5V12h2v-2h-3.5zM11 14c-2.67 0-8 1.34-8 4v2h10.76c-.48-.72-.76-1.58-.76-2.5 0-1.18.46-2.26 1.21-3.06-1.17-.29-2.33-.44-3.21-.44z\"/></g>\n<g id=\"av-timer\"><path d=\"M11 17c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1zm0-14v4h2V5.08c3.39.49 6 3.39 6 6.92 0 3.87-3.13 7-7 7s-7-3.13-7-7c0-1.68.59-3.22 1.58-4.42L12 13l1.41-1.41-6.8-6.8v.02C4.42 6.45 3 9.05 3 12c0 4.97 4.02 9 9 9 4.97 0 9-4.03 9-9s-4.03-9-9-9h-1zm7 9c0-.55-.45-1-1-1s-1 .45-1 1 .45 1 1 1 1-.45 1-1zM6 12c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1z\"/></g>\n<g id=\"closed-caption\"><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\"/></g>\n<g id=\"equalizer\"><path d=\"M10 20h4V4h-4v16zm-6 0h4v-8H4v8zM16 9v11h4V9h-4z\"/></g>\n<g id=\"explicit\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h4v2h-4v2h4v2H9V7h6v2z\"/></g>\n<g id=\"fast-forward\"><path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\"/></g>\n<g id=\"fast-rewind\"><path d=\"M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z\"/></g>\n<g id=\"games\"><path d=\"M15 7.5V2H9v5.5l3 3 3-3zM7.5 9H2v6h5.5l3-3-3-3zM9 16.5V22h6v-5.5l-3-3-3 3zM16.5 9l-3 3 3 3H22V9h-5.5z\"/></g>\n<g id=\"genres\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4 6h-3v7c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3c.55 0 1.06.16 1.5.42V6H16v2z\"/></g>\n<g id=\"hearing\"><path d=\"M17 20c-.29 0-.56-.06-.76-.15-.71-.37-1.21-.88-1.71-2.38-.51-1.56-1.47-2.29-2.39-3-.79-.61-1.61-1.24-2.32-2.53C9.29 10.98 9 9.93 9 9c0-2.8 2.2-5 5-5s5 2.2 5 5h2c0-3.93-3.07-7-7-7S7 5.07 7 9c0 1.26.38 2.65 1.07 3.9.91 1.65 1.98 2.48 2.85 3.15.81.62 1.39 1.07 1.71 2.05.6 1.82 1.37 2.84 2.73 3.55.51.23 1.07.35 1.64.35 2.21 0 4-1.79 4-4h-2c0 1.1-.9 2-2 2zM7.64 2.64L6.22 1.22C4.23 3.21 3 5.96 3 9s1.23 5.79 3.22 7.78l1.41-1.41C6.01 13.74 5 11.49 5 9s1.01-4.74 2.64-6.36zM11.5 9c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5-1.12-2.5-2.5-2.5-2.5 1.12-2.5 2.5z\"/></g>\n<g id=\"high-quality\"><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 11H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm7-1c0 .55-.45 1-1 1h-.75v1.5h-1.5V15H14c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v4zm-3.5-.5h2v-3h-2v3z\"/></g>\n<g id=\"ifl\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM8 9.5c-.83 0-1.5-.67-1.5-1.5S7.17 6.5 8 6.5s1.5.67 1.5 1.5S8.83 9.5 8 9.5zm4 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"instant-mix\"><path d=\"M7 4H5v5h2V4zm12 0h-2v9h2V4zM3 13h2v7h2v-7h2v-2H3v2zm12-6h-2V4h-2v3H9v2h6V7zm-4 13h2v-9h-2v9zm4-5v2h2v3h2v-3h2v-2h-6z\"/></g>\n<g id=\"ios\"><path d=\"M4 9h2V7H4v2zm0 8h2v-6H4v6zm7-10H9c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h2c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H9V9h2v6zm9-6V7h-4c-1.1 0-2 .9-2 2v2c0 1.1.9 2 2 2h2v2h-4v2h4c1.1 0 2-.9 2-2v-2c0-1.1-.9-2-2-2h-2V9h4z\"/></g>\n<g id=\"loop\"><path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\"/></g>\n<g id=\"mic\"><path d=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"/></g>\n<g id=\"mic-none\"><path d=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1.2-9.1c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2l-.01 6.2c0 .66-.53 1.2-1.19 1.2-.66 0-1.2-.54-1.2-1.2V4.9zm6.5 6.1c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"/></g>\n<g id=\"mic-off\"><path d=\"M19 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28zm-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18l5.98 5.99zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 .22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c.91-.13 1.77-.45 2.54-.9L19.73 21 21 19.73 4.27 3z\"/></g>\n<g id=\"movie\"><path d=\"M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4z\"/></g>\n<g id=\"movie-info\"><path d=\"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5 19H3v-2h2v2zm0-4H3v-2h2v2zm0-4H3V9h2v2zm0-4H3V5h2v2zm8 10h-2v-6h2v6zm0-8h-2V7h2v2zm8 10h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V9h2v2zm0-4h-2V5h2v2z\"/></g>\n<g id=\"my-library-add\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z\"/></g>\n<g id=\"my-library-books\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9H9V9h10v2zm-4 4H9v-2h6v2zm4-8H9V5h10v2z\"/></g>\n<g id=\"my-library-music\"><path d=\"M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 5h-3v5.5c0 1.38-1.12 2.5-2.5 2.5S10 13.88 10 12.5s1.12-2.5 2.5-2.5c.57 0 1.08.19 1.5.51V5h4v2zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6z\"/></g>\n<g id=\"new-releases\"><path d=\"M23 12l-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68L23 12zm-10 5h-2v-2h2v2zm0-4h-2V7h2v6z\"/></g>\n<g id=\"news\"><path d=\"M20.33 4.67L18.67 3 17 4.67 15.33 3l-1.67 1.67L12 3l-1.67 1.67L8.67 3 7 4.67 5.33 3 3.67 4.67 2 3v16c0 1.1.9 2 2 2h16c1.1 0 1.99-.9 1.99-2L22 3l-1.67 1.67zM12 19H4v-7h8v7zm8 0h-7v-1h7v1zm0-2h-7v-1h7v1zm0-2h-7v-1h7v1zm0-2h-7v-1h7v1zm0-2H4V8h16v3z\"/></g>\n<g id=\"not-interested\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9L16.9 18.31C15.55 19.37 13.85 20 12 20zm6.31-3.1L7.1 5.69C8.45 4.63 10.15 4 12 4c4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z\"/></g>\n<g id=\"pause\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></g>\n<g id=\"pause-circle-fill\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 14H9V8h2v8zm4 0h-2V8h2v8z\"/></g>\n<g id=\"pause-circle-outline\"><path d=\"M9 16h2V8H9v8zm3-14C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm1-4h2V8h-2v8z\"/></g>\n<g id=\"play-arrow\"><path d=\"M8 5v14l11-7z\"/></g>\n<g id=\"play-circle-fill\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 14.5v-9l6 4.5-6 4.5z\"/></g>\n<g id=\"play-circle-outline\"><path d=\"M10 16.5l6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"playlist-add\"><path d=\"M14 10H2v2h12v-2zm0-4H2v2h12V6zm4 8v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2 16h8v-2H2v2z\"/></g>\n<g id=\"play-shopping-bag\"><path d=\"M16 6V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H2v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6h-6zm-6-2h4v2h-4V4zM9 18V9l7.5 4L9 18z\"/></g>\n<g id=\"queue\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z\"/></g>\n<g id=\"queue-music\"><path d=\"M15 6H3v2h12V6zm0 4H3v2h12v-2zM3 16h8v-2H3v2zM17 6v8.18c-.31-.11-.65-.18-1-.18-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3V8h3V6h-5z\"/></g>\n<g id=\"radio\"><path d=\"M3.24 6.15C2.51 6.43 2 7.17 2 8v12c0 1.1.89 2 2 2h16c1.11 0 2-.9 2-2V8c0-1.11-.89-2-2-2H8.3l8.26-3.34L15.88 1 3.24 6.15zM7 20c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm13-8h-2v-2h-2v2H4V8h16v4z\"/></g>\n<g id=\"recent-actors\"><path d=\"M21 5v14h2V5h-2zm-4 14h2V5h-2v14zM14 5H2c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zM8 7.75c1.24 0 2.25 1.01 2.25 2.25S9.24 12.25 8 12.25 5.75 11.24 5.75 10 6.76 7.75 8 7.75zM12.5 17h-9v-.75c0-1.5 3-2.25 4.5-2.25s4.5.75 4.5 2.25V17z\"/></g>\n<g id=\"repeat\"><path d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z\"/></g>\n<g id=\"repeat-one\"><path d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4zm-4-2V9h-1l-2 1v1h1.5v4H13z\"/></g>\n<g id=\"replay\"><path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/></g>\n<g id=\"shuffle\"><path d=\"M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z\"/></g>\n<g id=\"skip-next\"><path d=\"M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z\"/></g>\n<g id=\"skip-previous\"><path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/></g>\n<g id=\"snooze\"><path d=\"M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-3-9h3.63L9 15.2V17h6v-2h-3.63L15 10.8V9H9v2z\"/></g>\n<g id=\"stop\"><path d=\"M6 6h12v12H6z\"/></g>\n<g id=\"subtitles\"><path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z\"/></g>\n<g id=\"surround-sound\"><path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM7.76 16.24l-1.41 1.41C4.78 16.1 4 14.05 4 12c0-2.05.78-4.1 2.34-5.66l1.41 1.41C6.59 8.93 6 10.46 6 12s.59 3.07 1.76 4.24zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm5.66 1.66l-1.41-1.41C17.41 15.07 18 13.54 18 12s-.59-3.07-1.76-4.24l1.41-1.41C19.22 7.9 20 9.95 20 12c0 2.05-.78 4.1-2.34 5.66zM12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"videocam\"><path d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\"/></g>\n<g id=\"videocam-off\"><path d=\"M21 6.5l-4 4V7c0-.55-.45-1-1-1H9.82L21 17.18V6.5zM3.27 2L2 3.27 4.73 6H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.21 0 .39-.08.54-.18L19.73 21 21 19.73 3.27 2z\"/></g>\n<g id=\"video-collection\"><path d=\"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8 12.5v-9l6 4.5-6 4.5z\"/></g>\n<g id=\"volume-down\"><path d=\"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z\"/></g>\n<g id=\"volume-mute\"><path d=\"M7 9v6h4l5 5V4l-5 5H7z\"/></g>\n<g id=\"volume-off\"><path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"/></g>\n<g id=\"volume-up\"><path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/></g>\n<g id=\"web\"><path d=\"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 14H4v-4h11v4zm0-5H4V9h11v4zm5 5h-4V9h4v9z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/bower.json",
    "content": "{\n  \"name\": \"core-icons\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-icon\": \"Polymer/core-icon#^0.5.0\",\n    \"core-iconset-svg\": \"Polymer/core-iconset-svg#^0.5.0\",\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-icons/communication-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"communication\" iconSize=\"24\">\n<svg><defs>\n<g id=\"business\"><path d=\"M12 7v-4h-10v18h20v-14h-10zm-6 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm4 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2v-2h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\"/></g>\n<g id=\"call\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1v3.49c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/></g>\n<g id=\"call-end\"><path d=\"M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29l-2.48-2.48c-.18-.17-.29-.42-.29-.7 0-.28.11-.53.29-.71 3.05-2.89 7.17-4.67 11.71-4.67s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28-.79-.74-1.69-1.36-2.67-1.85-.33-.16-.56-.5-.56-.9v-3.1c-1.44-.48-2.99-.73-4.59-.73z\"/></g>\n<g id=\"call-made\"><path d=\"M9 5v2h6.59l-11.59 11.59 1.41 1.41 11.59-11.59v6.59h2v-10z\"/></g>\n<g id=\"call-merge\"><path d=\"M17 20.41l1.41-1.41-3.41-3.41-1.41 1.41 3.41 3.41zm-9.5-12.41h3.5v5.59l-5.41 5.41 1.41 1.41 6-6v-6.41h3.5l-4.5-4.5-4.5 4.5z\"/></g>\n<g id=\"call-missed\"><path d=\"M19.59 7l-7.59 7.59-5.59-5.59h4.59v-2h-8v8h2v-4.59l7 7 9-9z\"/></g>\n<g id=\"call-received\"><path d=\"M20 5.41l-1.41-1.41-11.59 11.59v-6.59h-2v10h10v-2h-6.59z\"/></g>\n<g id=\"call-split\"><path d=\"M14 4l2.29 2.29-2.88 2.88 1.42 1.42 2.88-2.88 2.29 2.29v-6zm-4 0h-6v6l2.29-2.29 4.71 4.7v7.59h2v-8.41l-5.29-5.3z\"/></g>\n<g id=\"chat\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-14 7h12v2h-12v-2zm8 5h-8v-2h8v2zm4-6h-12v-2h12v2z\"/></g>\n<g id=\"clear-all\"><path d=\"M5 13h14v-2h-14v2zm-2 4h14v-2h-14v2zm4-10v2h14v-2h-14z\"/></g>\n<g id=\"comment\"><path d=\"M21.99 4c0-1.1-.89-2-1.99-2h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18zm-3.99 10h-12v-2h12v2zm0-3h-12v-2h12v2zm0-3h-12v-2h12v2z\"/></g>\n<g id=\"contacts\"><path d=\"M20 0h-16v2h16v-2zm-16 24h16v-2h-16v2zm16-20h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25-2.25-1.01-2.25-2.25 1.01-2.25 2.25-2.25zm5 10.25h-10v-1.5c0-1.67 3.33-2.5 5-2.5s5 .83 5 2.5v1.5z\"/></g>\n<g id=\"dialer-sip\"><path d=\"M17 3h-1v5h1v-5zm-2 2h-2v-1h2v-1h-3v3h2v1h-2v1h3v-3zm3-2v5h1v-2h2v-3h-3zm2 2h-1v-1h1v1zm0 10.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.01.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.27-.26.35-.65.24-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z\"/></g>\n<g id=\"dialpad\"><path d=\"M12 19c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6-18c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-6 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"dnd-on\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9l11.21 11.21c-1.35 1.06-3.05 1.69-4.9 1.69zm6.31-3.1l-11.21-11.21c1.35-1.06 3.05-1.69 4.9-1.69 4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z\"/></g>\n<g id=\"email\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"forum\"><path d=\"M21 6h-2v9h-13v2c0 .55.45 1 1 1h11l4 4v-15c0-.55-.45-1-1-1zm-4 6v-9c0-.55-.45-1-1-1h-13c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z\"/></g>\n<g id=\"hangout\"><path d=\"M11.5 2c-4.69 0-8.5 3.81-8.5 8.5s3.81 8.5 8.5 8.5h.5v3.5c4.86-2.34 8-7.5 8-12 0-4.69-3.81-8.5-8.5-8.5zm-.5 9l-1 2h-1.5l1-2h-1.5v-3h3v3zm4 0l-1 2h-1.5l1-2h-1.5v-3h3v3z\"/></g>\n<g id=\"hangout-video\"><path d=\"M20 4h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-2 12l-4-3.2v3.2h-8v-8h8v3.2l4-3.2v8z\"/></g>\n<g id=\"hangout-video-off\"><path d=\"M20 4h-12.18l4 4h2.18v2.18l.57.57 3.43-2.75v6.18l3.98 3.98.02-.16v-12c0-1.1-.9-2-2-2zm-17.73-3l-1.27 1.27 2 2c-.59.35-1 .99-1 1.73v12c0 1.1.9 2 2 2h14.73l2 2 1.27-1.27-19.73-19.73zm3.73 7h.73l7.27 7.27v.73h-8v-8z\"/></g>\n<g id=\"import-export\"><path d=\"M9 3l-4 3.99h3v7.01h2v-7.01h3l-4-3.99zm7 14.01v-7.01h-2v7.01h-3l4 3.99 4-3.99h-3z\"/></g>\n<g id=\"invert-colors-off\"><path d=\"M20.65 20.87l-2.35-2.35-6.3-6.29-3.56-3.57-1.42-1.41-2.75-2.75-1.27 1.27 2.78 2.78c-2.55 3.14-2.36 7.76.56 10.69 1.56 1.56 3.61 2.34 5.66 2.34 1.79 0 3.57-.59 5.03-1.78l2.7 2.7 1.27-1.27-.35-.36zm-8.65-1.28c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24 0-1.32.43-2.57 1.21-3.6l4.79 4.78v4.82zm0-14.49v4.58l7.25 7.26c1.37-2.96.84-6.57-1.6-9.01l-5.65-5.66-3.7 3.7 1.41 1.41 2.29-2.28z\"/></g>\n<g id=\"invert-colors-on\"><path d=\"M17.66 7.93l-5.66-5.66-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34 2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zm-5.66 11.66c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24s.62-3.11 1.76-4.24l4.24-4.25v14.49z\"/></g>\n<g id=\"live-help\"><path d=\"M19 2h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6 16h-2v-2h2v2zm2.07-7.75l-.9.92c-.72.73-1.17 1.33-1.17 2.83h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2h-2c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\"/></g>\n<g id=\"location-off\"><path d=\"M12 6.5c1.38 0 2.5 1.12 2.5 2.5 0 .74-.33 1.39-.83 1.85l3.63 3.63c.98-1.86 1.7-3.8 1.7-5.48 0-3.87-3.13-7-7-7-1.98 0-3.76.83-5.04 2.15l3.19 3.19c.46-.52 1.11-.84 1.85-.84zm4.37 9.6l-4.63-4.63-.11-.11-8.36-8.36-1.27 1.27 3.18 3.18c-.11.5-.18 1.02-.18 1.55 0 5.25 7 13 7 13s1.67-1.85 3.38-4.35l3.35 3.35 1.27-1.27-3.63-3.63z\"/></g>\n<g id=\"location-on\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"message\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-2 12h-12v-2h12v2zm0-3h-12v-2h12v2zm0-3h-12v-2h12v2z\"/></g>\n<g id=\"messenger\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"no-sim\"><path d=\"M18.99 5c0-1.1-.89-2-1.99-2h-7l-2.34 2.34 11.34 11.34-.01-11.68zm-15.34-1.12l-1.27 1.27 2.62 2.62v11.23c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27-17.47-17.47z\"/></g>\n<g id=\"phone\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1v3.49c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/></g>\n<g id=\"portable-wifi-off\"><path d=\"M17.56 14.24c.28-.69.44-1.45.44-2.24 0-3.31-2.69-6-6-6-.79 0-1.55.16-2.24.44l1.62 1.62c.2-.03.41-.06.62-.06 2.21 0 4 1.79 4 4 0 .21-.02.42-.05.63l1.61 1.61zm-5.56-10.24c4.42 0 8 3.58 8 8 0 1.35-.35 2.62-.95 3.74l1.47 1.47c.94-1.52 1.48-3.3 1.48-5.21 0-5.52-4.48-10-10-10-1.91 0-3.69.55-5.21 1.47l1.46 1.46c1.12-.59 2.4-.93 3.75-.93zm-8.73-1.5l-1.27 1.27 2.1 2.1c-1.31 1.7-2.1 3.82-2.1 6.13 0 3.7 2.01 6.92 4.99 8.65l1-1.73c-2.38-1.39-3.99-3.96-3.99-6.92 0-1.76.57-3.38 1.53-4.69l1.43 1.44c-.6.93-.96 2.05-.96 3.25 0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-.65.17-1.25.44-1.79l1.58 1.58-.02.21c0 1.1.9 2 2 2l.21-.02.01.01 7.51 7.51 1.27-1.27-16.73-16.73-1-1z\"/></g>\n<g id=\"quick-contacts-dialer\"><path d=\"M22 3h-20c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2l.01-14c0-1.1-.9-2-2-2zm-14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm3.85-4h1.64l1.51 2-1.99 1.99c-1.31-.98-2.28-2.38-2.73-3.99-.18-.64-.28-1.31-.28-2s.1-1.36.28-2c.45-1.62 1.42-3.01 2.73-3.99l1.99 1.99-1.51 2h-1.64c-.22.63-.35 1.3-.35 2s.13 1.37.35 2z\"/></g>\n<g id=\"quick-contacts-mail\"><path d=\"M21 8v-1l-3 2-3-2v1l3 2 3-2zm1-5h-20c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2l.01-14c0-1.1-.9-2-2-2zm-14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm8-6h-8v-6h8v6z\"/></g>\n<g id=\"ring-volume\"><path d=\"M23.71 16.67c-3.05-2.89-7.17-4.67-11.71-4.67-4.54 0-8.66 1.78-11.71 4.67-.18.18-.29.43-.29.71 0 .28.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73s3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.66 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71 0-.27-.11-.52-.29-.7zm-2.55-10.41l-1.41-1.41-3.56 3.55 1.41 1.41s3.45-3.52 3.56-3.55zm-8.16-4.26h-2v5h2v-5zm-6.6 7.81l1.41-1.41-3.55-3.56-1.42 1.42c.11.03 3.56 3.55 3.56 3.55z\"/></g>\n<g id=\"stay-current-landscape\"><path d=\"M1.01 7l-.01 10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-18c-1.1 0-1.99.9-1.99 2zm17.99 0v10h-14v-10h14z\"/></g>\n<g id=\"stay-current-portrait\"><path d=\"M17 1.01l-10-.01c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"stay-primary-landscape\"><path d=\"M1.01 7l-.01 10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-18c-1.1 0-1.99.9-1.99 2zm17.99 0v10h-14v-10h14z\"/></g>\n<g id=\"stay-primary-portrait\"><path d=\"M17 1.01l-10-.01c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"swap-calls\"><path d=\"M18 4l-4 4h3v7c0 1.1-.9 2-2 2s-2-.9-2-2v-7c0-2.21-1.79-4-4-4s-4 1.79-4 4v7h-3l4 4 4-4h-3v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 2.21 1.79 4 4 4s4-1.79 4-4v-7h3l-4-4z\"/></g>\n<g id=\"textsms\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-11 9h-2v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2z\"/></g>\n<g id=\"voicemail\"><path d=\"M18.5 6c-3.04 0-5.5 2.46-5.5 5.5 0 1.33.47 2.55 1.26 3.5h-4.52c.79-.95 1.26-2.17 1.26-3.5 0-3.04-2.46-5.5-5.5-5.5s-5.5 2.46-5.5 5.5 2.46 5.5 5.5 5.5h13c3.04 0 5.5-2.46 5.5-5.5s-2.46-5.5-5.5-5.5zm-13 9c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5zm13 0c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g>\n<g id=\"vpn-key\"><path d=\"M12.65 10c-.82-2.33-3.04-4-5.65-4-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4h4.35v4h4v-4h2v-4h-10.35zm-5.65 4c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/core-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<!--\n\n`core-icons` is a utitliy import that includes the definition for the `core-icon` element, `core-iconset-svg` element, as well as an import for the default icon set.\n\nThe `core-icons` directory also includes imports for additional icon sets that can be loaded into your project.\n\nExample loading icon set:\n\n    <link rel=\"import\" href=\"../core-icons/maps-icons.html\">\n\nTo use an icon from one of these sets, first prefix your `core-icon` with the icon set name, followed by a colon, \":\", and then the icon id.\n\nExample using the directions-bus icon from the maps icon set:\n\n    <core-icon icon=\"maps:directions-bus\"></core-icon>\n\n\nSee [core-icon](#core-icon) for more information about working with icons.\n\nSee [core-iconset](#core-iconset) and [core-iconset-svg](#core-iconset-svg) for more information about how to create a custom iconset.\n\n@group Polymer Core Elements\n@homepage polymer.github.io\n-->\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"icons\" iconSize=\"24\">\n<svg><defs>\n<g id=\"accessibility\"><path d=\"M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6h-2v-13h-6v-2h18v2z\"/></g>\n<g id=\"account-balance\"><path d=\"M4 10v7h3v-7h-3zm6 0v7h3v-7h-3zm-8 12h19v-3h-19v3zm14-12v7h3v-7h-3zm-4.5-9l-9.5 5v2h19v-2l-9.5-5z\"/></g>\n<g id=\"account-balance-wallet\"><path d=\"M21 18v1c0 1.1-.9 2-2 2h-14c-1.11 0-2-.9-2-2v-14c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10v-8h-10v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"account-box\"><path d=\"M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-14c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1h-12v-1z\"/></g>\n<g id=\"account-child\"><path d=\"M16.5 12c1.38 0 2.49-1.12 2.49-2.5s-1.11-2.5-2.49-2.5c-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5zm-7.5-1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75v2.25h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zm-7.5-1c-2.33 0-7 1.17-7 3.5v2.5h7v-2.25c0-.85.33-2.34 2.37-3.47-.87-.18-1.71-.28-2.37-.28z\"/></g>\n<g id=\"account-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\"/></g>\n<g id=\"add-box\"><path d=\"M19 3h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g>\n<g id=\"add-circle-outline\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"add-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g>\n<g id=\"add\"><path d=\"M19 13h-6v6h-2v-6h-6v-2h6v-6h2v6h6v2z\"/></g>\n<g id=\"add-shopping-cart\"><path d=\"M11 9h2v-3h3v-2h-3v-3h-2v3h-3v2h3v3zm-4 9c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm10 0c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-9.83-3.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.86-7.01-1.74-.96h-.01l-1.1 2-2.76 5h-7.02l-.13-.27-2.24-4.73-.95-2-.94-2h-3.27v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.13 0-.25-.11-.25-.25z\"/></g>\n<g id=\"alarm-add\"><path d=\"M7.88 3.39l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm14.12 2.33l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-10-1.72c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\"/></g>\n<g id=\"alarm-off\"><path d=\"M12 6c3.87 0 7 3.13 7 7 0 .84-.16 1.65-.43 2.4l1.52 1.52c.58-1.19.91-2.51.91-3.92 0-4.97-4.03-9-9-9-1.41 0-2.73.33-3.92.91l1.52 1.52c.75-.27 1.56-.43 2.4-.43zm10-.28l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-19.08-3.43l-1.27 1.28 1.33 1.33-1.11.93 1.42 1.42 1.11-.94.8.8c-1.37 1.58-2.2 3.64-2.2 5.89 0 4.97 4.02 9 9 9 2.25 0 4.31-.83 5.89-2.2l2.2 2.2 1.27-1.27-17.47-17.46-.97-.98zm13.55 16.1c-1.21 1-2.77 1.61-4.47 1.61-3.87 0-7-3.13-7-7 0-1.7.61-3.26 1.61-4.47l9.86 9.86zm-8.45-15.11l-1.42-1.42-.86.71 1.42 1.42.86-.71z\"/></g>\n<g id=\"alarm-on\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.12.61c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-1.46-5.47l-2.13-2.13-1.06 1.06 3.18 3.18 6-6-1.06-1.06-4.93 4.95z\"/></g>\n<g id=\"alarm\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.62 4.61h-1.5v6l4.75 2.85.75-1.23-4-2.37v-5.25zm-.5-4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"android\"><path d=\"M6 18c0 .55.45 1 1 1h1v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h2v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-3.5h1c.55 0 1-.45 1-1v-10h-12v10zm-2.5-10c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm17 0c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm-4.97-5.84l1.3-1.3c.2-.2.2-.51 0-.71-.2-.2-.51-.2-.71 0l-1.48 1.48c-.79-.4-1.69-.63-2.64-.63-.96 0-1.86.23-2.66.63l-1.49-1.48c-.2-.2-.51-.2-.71 0-.2.2-.2.51 0 .71l1.31 1.31c-1.48 1.09-2.45 2.84-2.45 4.83h12c0-1.99-.97-3.75-2.47-4.84zm-5.53 2.84h-1v-1h1v1zm5 0h-1v-1h1v1z\"/></g>\n<g id=\"announcement\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7 9h-2v-6h2v6zm0 4h-2v-2h2v2z\"/></g>\n<g id=\"apps\"><path d=\"M4 8h4v-4h-4v4zm6 12h4v-4h-4v4zm-6 0h4v-4h-4v4zm0-6h4v-4h-4v4zm6 0h4v-4h-4v4zm6-10v4h4v-4h-4zm-6 4h4v-4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"/></g>\n<g id=\"archive\"><path d=\"M20.54 5.23l-1.39-1.68c-.27-.34-.68-.55-1.15-.55h-12c-.47 0-.88.21-1.16.55l-1.38 1.68c-.29.34-.46.79-.46 1.27v12.5c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12.5c0-.48-.17-.93-.46-1.27zm-8.54 12.27l-5.5-5.5h3.5v-2h4v2h3.5l-5.5 5.5zm-6.88-12.5l.81-1h12l.94 1h-13.75z\"/></g>\n<g id=\"arrow-back\"><path d=\"M20 11h-12.17l5.59-5.59-1.42-1.41-8 8 8 8 1.41-1.41-5.58-5.59h12.17v-2z\"/></g>\n<g id=\"arrow-drop-down-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 12l-4-4h8l-4 4z\"/></g>\n<g id=\"arrow-drop-down\"><path d=\"M7 10l5 5 5-5z\"/></g>\n<g id=\"arrow-drop-up\"><path d=\"M7 14l5-5 5 5z\"/></g>\n<g id=\"arrow-forward\"><path d=\"M12 4l-1.41 1.41 5.58 5.59h-12.17v2h12.17l-5.58 5.59 1.41 1.41 8-8z\"/></g>\n<g id=\"aspect-ratio\"><path d=\"M19 12h-2v3h-3v2h5v-5zm-12-3h3v-2h-5v5h2v-3zm14-6h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"assessment\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g>\n<g id=\"assignment-ind\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 4c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1.4c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1.4z\"/></g>\n<g id=\"assignment-late\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6 15h-2v-2h2v2zm0-4h-2v-6h2v6zm-1-9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"assignment\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14h-7v-2h7v2zm3-4h-10v-2h10v2zm0-4h-10v-2h10v2z\"/></g>\n<g id=\"assignment-returned\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3v-4h4v4h3l-5 5z\"/></g>\n<g id=\"assignment-return\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm4 12h-4v3l-5-5 5-5v3h4v4z\"/></g>\n<g id=\"assignment-turned-in\"><path d=\"M19 3h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-2 14l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g>\n<g id=\"attachment\"><path d=\"M7.5 18c-3.04 0-5.5-2.46-5.5-5.5s2.46-5.5 5.5-5.5h10.5c2.21 0 4 1.79 4 4s-1.79 4-4 4h-8.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5h7.5v1.5h-7.5c-.55 0-1 .45-1 1s.45 1 1 1h8.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5h-10.5c-2.21 0-4 1.79-4 4s1.79 4 4 4h9.5v1.5h-9.5z\"/></g>\n<g id=\"autorenew\"><path d=\"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26l1.46-1.46c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74l-1.46 1.46c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z\"/></g>\n<g id=\"backspace\"><path d=\"M22 3h-15c-.69 0-1.23.35-1.59.88l-5.41 8.12 5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-3 12.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g>\n<g id=\"backup\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g>\n<g id=\"block\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-8 10c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69l-11.21 11.21c-1.06-1.35-1.69-3.05-1.69-4.9zm8 8c-1.85 0-3.55-.63-4.9-1.69l11.21-11.21c1.06 1.35 1.69 3.05 1.69 4.9 0 4.42-3.58 8-8 8z\"/></g>\n<g id=\"bookmark-outline\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g>\n<g id=\"bookmark\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"book\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g>\n<g id=\"bug-report\"><path d=\"M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96l1.63-1.63-1.41-1.41-2.17 2.17c-.46-.11-.93-.17-1.42-.17-.49 0-.96.06-1.41.17l-2.18-2.17-1.41 1.41 1.62 1.63c-.74.51-1.36 1.18-1.81 1.96h-2.81v2h2.09c-.05.33-.09.66-.09 1v1h-2v2h2v1c0 .34.04.67.09 1h-2.09v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3h2.81v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1h2.09v-2zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z\"/></g>\n<g id=\"cached\"><path d=\"M19 8l-4 4h3c0 3.31-2.69 6-6 6-1.01 0-1.97-.25-2.8-.7l-1.46 1.46c1.23.78 2.69 1.24 4.26 1.24 4.42 0 8-3.58 8-8h3l-4-4zm-13 4c0-3.31 2.69-6 6-6 1.01 0 1.97.25 2.8.7l1.46-1.46c-1.23-.78-2.69-1.24-4.26-1.24-4.42 0-8 3.58-8 8h-3l4 4 4-4h-3z\"/></g>\n<g id=\"cancel\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm5 13.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z\"/></g>\n<g id=\"check-box-outline-blank\"><path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"check-box\"><path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></g>\n<g id=\"check\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g>\n<g id=\"chevron-left\"><path d=\"M15.41 7.41l-1.41-1.41-6 6 6 6 1.41-1.41-4.58-4.59z\"/></g>\n<g id=\"chevron-right\"><path d=\"M10 6l-1.41 1.41 4.58 4.59-4.58 4.59 1.41 1.41 6-6z\"/></g>\n<g id=\"class\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8z\"/></g>\n<g id=\"clear\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g>\n<g id=\"close\"><path d=\"M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z\"/></g>\n<g id=\"cloud-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm4.5 14h-8.5c-1.66 0-3-1.34-3-3s1.34-3 3-3l.14.01c.44-1.73 1.99-3.01 3.86-3.01 2.21 0 4 1.79 4 4h.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"cloud-done\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-9.35 6.96l-3.5-3.5 1.41-1.41 2.09 2.08 5.18-5.17 1.41 1.41-6.59 6.59z\"/></g>\n<g id=\"cloud-download\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-2.35 2.96l-5 5-5-5h3v-4h4v4h3z\"/></g>\n<g id=\"cloud-off\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-1.48 0-2.85.43-4.01 1.17l1.46 1.46c.76-.4 1.63-.63 2.55-.63 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3 0 1.13-.64 2.11-1.56 2.62l1.45 1.45c1.27-.91 2.11-2.39 2.11-4.07 0-2.64-2.05-4.78-4.65-4.96zm-16.35-4.77l2.75 2.74c-3.19.14-5.75 2.76-5.75 5.99 0 3.31 2.69 6 6 6h11.73l2 2 1.27-1.27-16.73-16.73-1.27 1.27zm4.73 4.73l8 8h-9.73c-2.21 0-4-1.79-4-4s1.79-4 4-4h1.73z\"/></g>\n<g id=\"cloud\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z\"/></g>\n<g id=\"cloud-queue\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-.35 7.96h-13c-2.21 0-4-1.79-4-4s1.79-4 4-4h.71c.66-2.31 2.77-4 5.29-4 3.04 0 5.5 2.46 5.5 5.5v.5h1.5c1.66 0 3 1.34 3 3s-1.34 3-3 3z\"/></g>\n<g id=\"cloud-upload\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-5.35 2.96v4h-4v-4h-3l5-5 5 5h-3z\"/></g>\n<g id=\"content-copy\"><path d=\"M16 1h-12c-1.1 0-2 .9-2 2v14h2v-14h12v-2zm3 4h-11c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-11v-14h11v14z\"/></g>\n<g id=\"content-cut\"><path d=\"M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4s-4 1.79-4 4 1.79 4 4 4c.59 0 1.14-.13 1.64-.36l2.36 2.36-2.36 2.36c-.5-.23-1.05-.36-1.64-.36-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64l2.36-2.36 7 7h3v-1l-12.36-12.36zm-3.64.36c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zm7-9.5l-6 6 2 2 7-7v-1z\"/></g>\n<g id=\"content-paste\"><path d=\"M19 2h-4.18c-.42-1.16-1.52-2-2.82-2-1.3 0-2.4.84-2.82 2h-4.18c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18h-14v-16h2v3h10v-3h2v16z\"/></g>\n<g id=\"create\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g>\n<g id=\"credit-card\"><path d=\"M4 12h16v6h-16z\"/><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g>\n<g id=\"dashboard\"><path d=\"M3 13h8v-10h-8v10zm0 8h8v-6h-8v6zm10 0h8v-10h-8v10zm0-18v6h8v-6h-8z\"/></g>\n<g id=\"delete\"><path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-12h-12v12zm13-15h-3.5l-1-1h-5l-1 1h-3.5v2h14v-2z\"/></g>\n<g id=\"description\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 16h-8v-2h8v2zm0-4h-8v-2h8v2zm-3-5v-5.5l5.5 5.5h-5.5z\"/></g>\n<g id=\"developer-mode-tv\"><path d=\"M4 5h16v2h2v-2c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v2h2v-2zm3.55 8.83l-2.83-2.83 2.83-2.83-1.41-1.41-4.25 4.24 4.24 4.24 1.42-1.41zm12.45 3.17h-16v-2h-2v2c0 1.1.9 2 2 2h4v2h8v-2h4c1.1 0 1.99-.9 1.99-2v-2h-1.99v2zm2-6.01l-4.24-4.24-1.41 1.41 2.82 2.84-2.83 2.83 1.41 1.41 4.25-4.23v-.02z\"/></g>\n<g id=\"dns\"><path d=\"M20 13h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm13-16h-16c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-13 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"done-all\"><path d=\"M18 7l-1.41-1.41-6.34 6.34 1.41 1.41 6.34-6.34zm4.24-1.41l-10.58 10.58-4.18-4.17-1.41 1.41 5.59 5.59 12-12-1.42-1.41zm-21.83 7.82l5.59 5.59 1.41-1.41-5.58-5.59-1.42 1.41z\"/></g>\n<g id=\"done\"><path d=\"M9 16.17l-4.17-4.17-1.42 1.41 5.59 5.59 12-12-1.41-1.41z\"/></g>\n<g id=\"drafts\"><path d=\"M21.99 8c0-.72-.37-1.35-.94-1.7l-9.05-5.3-9.05 5.3c-.57.35-.95.98-.95 1.7v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2l-.01-10zm-9.99 5l-8.26-5.16 8.26-4.84 8.26 4.84-8.26 5.16z\"/></g>\n<g id=\"drawer\"><path d=\"M20,4H4C2.8,4,2,4.8,2,6v12c0,1.2,0.8,2,2,2h16c1,0,2-0.8,2-2V6C22,4.8,21,4,20,4z M20,18h-6V6h6V18z\"/></g>\n<g id=\"error\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-2h2v2zm0-4h-2v-6h2v6z\"/></g>\n<g id=\"event\"><path d=\"M17 12h-5v5h5v-5zm-1-11v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-1v-2h-2zm3 18h-14v-11h14v11z\"/></g>\n<g id=\"exit-to-app\"><path d=\"M10.09 15.59l1.41 1.41 5-5-5-5-1.41 1.41 2.58 2.59h-9.67v2h9.67l-2.58 2.59zm8.91-12.59h-14c-1.11 0-2 .9-2 2v4h2v-4h14v14h-14v-4h-2v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"expand-less\"><path d=\"M12 8l-6 6 1.41 1.41 4.59-4.58 4.59 4.58 1.41-1.41z\"/></g>\n<g id=\"expand-more\"><path d=\"M16.59 8.59l-4.59 4.58-4.59-4.58-1.41 1.41 6 6 6-6z\"/></g>\n<g id=\"explore\"><path d=\"M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zm0-8.9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm2.19 12.19l-8.19 3.81 3.81-8.19 8.19-3.81-3.81 8.19z\"/></g>\n<g id=\"extension\"><path d=\"M20.5 11h-1.5v-4c0-1.1-.9-2-2-2h-4v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5h-4c-1.1 0-1.99.9-1.99 2v3.8h1.49c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7h-1.5v3.8c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7v1.5h3.8c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5z\"/></g>\n<g id=\"face-unlock\"><path d=\"M14.69 17.1c-.74.58-1.7.9-2.69.9s-1.95-.32-2.69-.9c-.22-.17-.53-.13-.7.09-.17.22-.13.53.09.7.91.72 2.09 1.11 3.3 1.11s2.39-.39 3.31-1.1c.22-.17.26-.48.09-.7-.17-.23-.49-.26-.71-.1z\"/><circle cx=\"8.5\" cy=\"12.5\" r=\"1\"/><path d=\"M12 0c-6.63 0-12 5.37-12 12s5.37 12 12 12 12-5.37 12-12-5.37-12-12-12zm7.96 14.82c-1.09 3.74-4.27 6.46-8.04 6.46-3.78 0-6.96-2.72-8.04-6.47-1.19-.11-2.13-1.18-2.13-2.52 0-1.27.85-2.31 1.97-2.5 2.09-1.46 3.8-3.49 4.09-5.05v-.01c1.35 2.63 6.3 5.19 11.83 5.06l.3-.03c1.28 0 2.31 1.14 2.31 2.54 0 1.38-1.02 2.51-2.29 2.52z\"/><circle cx=\"15.5\" cy=\"12.5\" r=\"1\"/></g>\n<g id=\"favorite-outline\"><path d=\"M16.5 3c-1.74 0-3.41.81-4.5 2.09-1.09-1.28-2.76-2.09-4.5-2.09-3.08 0-5.5 2.42-5.5 5.5 0 3.78 3.4 6.86 8.55 11.54l1.45 1.31 1.45-1.32c5.15-4.67 8.55-7.75 8.55-11.53 0-3.08-2.42-5.5-5.5-5.5zm-4.4 15.55l-.1.1-.1-.1c-4.76-4.31-7.9-7.16-7.9-10.05 0-2 1.5-3.5 3.5-3.5 1.54 0 3.04.99 3.57 2.36h1.87c.52-1.37 2.02-2.36 3.56-2.36 2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z\"/></g>\n<g id=\"favorite\"><path d=\"M12 21.35l-1.45-1.32c-5.15-4.67-8.55-7.75-8.55-11.53 0-3.08 2.42-5.5 5.5-5.5 1.74 0 3.41.81 4.5 2.09 1.09-1.28 2.76-2.09 4.5-2.09 3.08 0 5.5 2.42 5.5 5.5 0 3.78-3.4 6.86-8.55 11.54l-1.45 1.31z\"/></g>\n<g id=\"file-download\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g>\n<g id=\"file-map\"><path d=\"M12 6.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm7-5.5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-6.5 16h-1c-.95-4.09-3.99-5.84-3.99-9 0-2.49 2-4.5 4.49-4.5s4.51 2.01 4.51 4.5c0 3.16-3.06 4.91-4.01 9z\"/></g>\n<g id=\"file-upload\"><path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2h-14z\"/></g>\n<g id=\"filter-list\"><path d=\"M10 18h4v-2h-4v2zm-7-12v2h18v-2h-18zm3 7h12v-2h-12v2z\"/></g>\n<g id=\"find-in-page\"><path d=\"M20 19.59v-11.59l-6-6h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84zm-11-6.59c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z\"/></g>\n<g id=\"find-replace\"><path d=\"M11 6c1.38 0 2.63.56 3.54 1.46l-2.54 2.54h6v-6l-2.05 2.05c-1.27-1.27-3.02-2.05-4.95-2.05-3.53 0-6.43 2.61-6.92 6h2.02c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14h-2.02c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46l2.54-2.54h-6v6l2.05-2.05c1.27 1.27 3.02 2.05 4.95 2.05 1.55 0 2.98-.51 4.14-1.36l4.86 4.85 1.49-1.49-4.85-4.86z\"/></g>\n<g id=\"flag\"><path d=\"M14.4 6l-.4-2h-9v17h2v-7h5.6l.4 2h7v-10z\"/></g>\n<g id=\"flip-to-back\"><path d=\"M9 7h-2v2h2v-2zm0 4h-2v2h2v-2zm0-8c-1.11 0-2 .9-2 2h2v-2zm4 12h-2v2h2v-2zm6-12v2h2c0-1.1-.9-2-2-2zm-6 0h-2v2h2v-2zm-4 14v-2h-2c0 1.1.89 2 2 2zm10-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm-14-10h-2v12c0 1.1.89 2 2 2h12v-2h-12v-12zm10-2h2v-2h-2v2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"flip-to-front\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm2 4v-2h-2c0 1.1.89 2 2 2zm-2-12h2v-2h-2v2zm12 12h2v-2h-2v2zm4-18h-10c-1.11 0-2 .9-2 2v10c0 1.1.89 2 2 2h10c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-10v-10h10v10zm-8 6h2v-2h-2v2zm-4 0h2v-2h-2v2z\"/></g>\n<g id=\"folder-open\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-16v-10h16v10z\"/></g>\n<g id=\"folder\"><path d=\"M10 4h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-8l-2-2z\"/></g>\n<g id=\"folder-shared\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-5 3c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 8h-8v-1c0-1.33 2.67-2 4-2s4 .67 4 2v1z\"/></g>\n<g id=\"forward\"><path d=\"M12 8v-4l8 8-8 8v-4h-8v-8z\"/></g>\n<g id=\"fullscreen-exit\"><path d=\"M5 16h3v3h2v-5h-5v2zm3-8h-3v2h5v-5h-2v3zm6 11h2v-3h3v-2h-5v5zm2-11v-3h-2v5h5v-2h-3z\"/></g>\n<g id=\"fullscreen\"><path d=\"M7 14h-2v5h5v-2h-3v-3zm-2-4h2v-3h3v-2h-5v5zm12 7h-3v2h5v-5h-2v3zm-3-12v2h3v3h2v-5h-5z\"/></g>\n<g id=\"gesture\"><path d=\"M4.59 6.89c.7-.71 1.4-1.35 1.71-1.22.5.2 0 1.03-.3 1.52-.25.42-2.86 3.89-2.86 6.31 0 1.28.48 2.34 1.34 2.98.75.56 1.74.73 2.64.46 1.07-.31 1.95-1.4 3.06-2.77 1.21-1.49 2.83-3.44 4.08-3.44 1.63 0 1.65 1.01 1.76 1.79-3.78.64-5.38 3.67-5.38 5.37 0 1.7 1.44 3.09 3.21 3.09 1.63 0 4.29-1.33 4.69-6.1h2.46v-2.5h-2.47c-.15-1.65-1.09-4.2-4.03-4.2-2.25 0-4.18 1.91-4.94 2.84-.58.73-2.06 2.48-2.29 2.72-.25.3-.68.84-1.11.84-.45 0-.72-.83-.36-1.92.35-1.09 1.4-2.86 1.85-3.52.78-1.14 1.3-1.92 1.3-3.28 0-2.17-1.64-2.86-2.51-2.86-1.32 0-2.47 1-2.72 1.25-.36.36-.66.66-.88.93l1.75 1.71zm9.29 11.66c-.31 0-.74-.26-.74-.72 0-.6.73-2.2 2.87-2.76-.3 2.69-1.43 3.48-2.13 3.48z\"/></g>\n<g id=\"get-app\"><path d=\"M19 9h-4v-6h-6v6h-4l7 7 7-7zm-14 9v2h14v-2h-14z\"/></g>\n<g id=\"grade\"><path d=\"M12 17.27l6.18 3.73-1.64-7.03 5.46-4.73-7.19-.61-2.81-6.63-2.81 6.63-7.19.61 5.46 4.73-1.64 7.03z\"/></g>\n<g id=\"group-work\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-4 15.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zm1.5-9.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5-2.5-1.12-2.5-2.5zm6.5 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"help\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92c-.72.73-1.17 1.33-1.17 2.83h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2h-2c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z\"/></g>\n<g id=\"highlight-remove\"><path d=\"M14.59 8l-2.59 2.59-2.59-2.59-1.41 1.41 2.59 2.59-2.59 2.59 1.41 1.41 2.59-2.59 2.59 2.59 1.41-1.41-2.59-2.59 2.59-2.59-1.41-1.41zm-2.59-6c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"history\"><path opacity=\".9\" d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g>\n<g id=\"home\"><path d=\"M10 20v-6h4v6h5v-8h3l-10-9-10 9h3v8z\"/></g>\n<g id=\"https\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g>\n<g id=\"inbox\"><path d=\"M19 3h-14.01c-1.1 0-1.98.9-1.98 2l-.01 14c0 1.1.89 2 1.99 2h14.01c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 12h-4c0 1.66-1.34 3-3 3s-3-1.34-3-3h-4.01v-10h14.01v10zm-3-5h-2v-3h-4v3h-2l4 4 4-4z\"/></g>\n<g id=\"info-outline\"><path d=\"M11 17h2v-6h-2v6zm1-15c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-11h2v-2h-2v2z\"/></g>\n<g id=\"info\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm1 15h-2v-6h2v6zm0-8h-2v-2h2v2z\"/></g>\n<g id=\"input\"><path d=\"M21 3.01h-18c-1.1 0-2 .9-2 2v3.99h2v-4.01h18v14.03h-18v-4.02h-2v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zm-10 12.99l4-4-4-4v3h-10v2h10v3z\"/></g>\n<g id=\"invert-colors\"><path d=\"M17.66 7.93l-5.66-5.66-5.66 5.66c-3.12 3.12-3.12 8.19 0 11.31 1.56 1.56 3.61 2.34 5.66 2.34 2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zm-5.66 11.66c-1.6 0-3.11-.62-4.24-1.76-1.14-1.14-1.76-2.64-1.76-4.24s.62-3.11 1.76-4.24l4.24-4.25v14.49z\"/></g>\n<g id=\"label-outline\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16zm-1.63 11.16h-11v-10h11l3.55 5-3.55 5z\"/></g>\n<g id=\"label\"><path d=\"M17.63 5.84c-.36-.51-.96-.84-1.63-.84l-11 .01c-1.1 0-2 .89-2 1.99v10c0 1.1.9 1.99 2 1.99l11 .01c.67 0 1.27-.33 1.63-.84l4.37-6.16-4.37-6.16z\"/></g>\n<g id=\"language\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zm-6.92-3.96c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zm-7.74 9.96c-.16-.64-.26-1.31-.26-2s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2h-3.38zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8h-2.95c.96-1.66 2.49-2.93 4.33-3.56-.6 1.11-1.06 2.31-1.38 3.56zm3.97 11.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zm2.34-5.96h-4.68c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zm1.77-5.56c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z\"/></g>\n<g id=\"launch\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g>\n<g id=\"link\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4v-1.9h-4c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9h-4c-1.71 0-3.1-1.39-3.1-3.1zm4.1 1h8v-2h-8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4v1.9h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></g>\n<g id=\"list\"><path d=\"M3 13h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm4 4h14v-2h-14v2zm0 4h14v-2h-14v2zm0-10v2h14v-2h-14z\"/></g>\n<g id=\"lock-open\"><path d=\"M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2h-9.1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-12v-10h12v10z\"/></g>\n<g id=\"lock-outline\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6-5.1c1.71 0 3.1 1.39 3.1 3.1v2h-6.1v-2h-.1c0-1.71 1.39-3.1 3.1-3.1zm6 17.1h-12v-10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"/></g>\n<g id=\"lock\"><path d=\"M18 8h-1v-2c0-2.76-2.24-5-5-5s-5 2.24-5 5v2h-1c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9h-6.2v-2c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></g>\n<g id=\"loyalty\"><path d=\"M21.41 11.58l-9-9c-.36-.36-.86-.58-1.41-.58h-7c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zm-15.91-4.58c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11.77 8.27l-4.27 4.27-4.27-4.27c-.45-.46-.73-1.08-.73-1.77 0-1.38 1.12-2.5 2.5-2.5.69 0 1.32.28 1.77.74l.73.72.73-.73c.45-.45 1.08-.73 1.77-.73 1.38 0 2.5 1.12 2.5 2.5 0 .69-.28 1.32-.73 1.77z\"/></g>\n<g id=\"mail\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"markunread-mailbox\"><path d=\"M20 6h-10v6h-2v-8h6v-4h-8v6h-2c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"markunread\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"menu\"><path d=\"M3 18h18v-2h-18v2zm0-5h18v-2h-18v2zm0-7v2h18v-2h-18z\"/></g>\n<g id=\"more-horiz\"><path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"more-vert\"><path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"note-add\"><path d=\"M14 2h-8c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6zm2 14h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2zm-3-7v-5.5l5.5 5.5h-5.5z\"/></g>\n<g id=\"open-in-browser\"><path d=\"M19 4h-14c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2h-4v-10h14v10h-4v2h4c1.1 0 2-.9 2-2v-12c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"/></g>\n<g id=\"open-in-new\"><path d=\"M19 19h-14v-14h7v-2h-7c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zm-5-16v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z\"/></g>\n<g id=\"open-with\"><path d=\"M10 9h4v-3h3l-5-5-5 5h3v3zm-1 1h-3v-3l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3h-3l5 5 5-5h-3v-3z\"/></g>\n<g id=\"pageview\"><path d=\"M11 8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8-5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-1.41 16l-3.83-3.83c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75l3.83 3.84-1.41 1.41z\"/></g>\n<g id=\"payment\"><path d=\"M20 4h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-6h16v6zm0-10h-16v-2h16v2z\"/></g>\n<g id=\"perm-camera-mic\"><path d=\"M20 5h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v-2.09c-2.83-.48-5-2.94-5-5.91h2c0 2.21 1.79 4 4 4s4-1.79 4-4h2c0 2.97-2.17 5.43-5 5.91v2.09h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-6 8c0 1.1-.9 2-2 2s-2-.9-2-2v-4c0-1.1.9-2 2-2s2 .9 2 2v4z\"/></g>\n<g id=\"perm-contact-cal\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12h-12v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z\"/></g>\n<g id=\"perm-data-setting\"><path d=\"M18.99 11.5c.34 0 .67.03 1 .07l.01-11.57-20 20h11.56c-.04-.33-.07-.66-.07-1 0-4.14 3.36-7.5 7.5-7.5zm3.71 7.99c.02-.16.04-.32.04-.49 0-.17-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.85-.49l-.19-1.32c-.01-.12-.12-.21-.24-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49 0 .17.01.33.03.49l-1.06.83c-.09.08-.12.21-.06.32l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.02.12.12.21.25.21h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.07-.83zm-3.71 1.01c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"perm-device-info\"><path d=\"M13 7h-2v2h2v-2zm0 4h-2v6h2v-6zm4-9.99l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"perm-identity\"><path d=\"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1-2.1-.94-2.1-2.1.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1h-12.2v-1.1c0-.64 3.13-2.1 6.1-2.1m0-10.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"perm-media\"><path d=\"M2 6h-2v5h.01l-.01 9c0 1.1.9 2 2 2h18v-2h-18v-14zm20-2h-8l-2-2h-6c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-15 11l4.5-6 3.5 4.51 2.5-3.01 3.5 4.5h-14z\"/></g>\n<g id=\"perm-phone-msg\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-8-12.5v10l3-3h6v-7h-9z\"/></g>\n<g id=\"perm-scan-wifi\"><path d=\"M12 3c-5.05 0-8.85 1.85-12 4.23l12 14.77 12-14.75c-3.15-2.38-6.95-4.25-12-4.25zm1 13h-2v-6h2v6zm-2-8v-2h2v2h-2z\"/></g>\n<g id=\"picture-in-picture\"><path d=\"M19 7h-8v6h8v-6zm2-4h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.03h18v14.03z\"/></g>\n<g id=\"polymer\"><path d=\"M19 4h-4l-7.89 12.63-2.61-4.63 4.5-8h-4l-4.5 8 4.5 8h4l7.89-12.63 2.61 4.63-4.5 8h4l4.5-8z\"/></g>\n<g id=\"print\"><path d=\"M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11h-8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9h-12v4h12v-4z\"/></g>\n<g id=\"query-builder\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g>\n<g id=\"question-answer\"><path d=\"M21 6h-2v9h-13v2c0 .55.45 1 1 1h11l4 4v-15c0-.55-.45-1-1-1zm-4 6v-9c0-.55-.45-1-1-1h-13c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z\"/></g>\n<g id=\"radio-button-off\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"radio-button-on\"><path d=\"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"receipt\"><path d=\"M18 17h-12v-2h12v2zm0-4h-12v-2h12v2zm0-4h-12v-2h12v2zm-15 13l1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5 1.5-1.5 1.5 1.5v-20l-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5-1.5 1.5-1.5-1.5v20z\"/></g>\n<g id=\"redeem\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g>\n<g id=\"redo\"><path d=\"M18.4 10.6c-1.85-1.61-4.25-2.6-6.9-2.6-4.65 0-8.58 3.03-9.96 7.22l2.36.78c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88l-3.62 3.62h9v-9l-3.6 3.6z\"/></g>\n<g id=\"refresh\"><path d=\"M17.65 6.35c-1.45-1.45-3.44-2.35-5.65-2.35-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78l-3.22 3.22h7v-7l-2.35 2.35z\"/></g>\n<g id=\"remove-circle-outline\"><path d=\"M7 11v2h10v-2h-10zm5-9c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"remove-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm5 11h-10v-2h10v2z\"/></g>\n<g id=\"remove\"><path d=\"M19 13h-14v-2h14v2z\"/></g>\n<g id=\"reorder\"><path d=\"M3,15h18v-2H3V15z M3,19h18v-2H3V19z M3,11h18V9H3V11z M3,5v2h18V5H3z\"/></g>\n<g id=\"reply-all\"><path d=\"M7 8v-3l-7 7 7 7v-3l-4-4 4-4zm6 1v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g>\n<g id=\"reply\"><path d=\"M10 9v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z\"/></g>\n<g id=\"report\"><path d=\"M15.73 3h-7.46l-5.27 5.27v7.46l5.27 5.27h7.46l5.27-5.27v-7.46l-5.27-5.27zm-3.73 14.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2v-6h2v6z\"/></g>\n<g id=\"report-problem\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g>\n<g id=\"restore\"><path d=\"M13 3c-4.97 0-9 4.03-9 9h-3l3.89 3.89.07.14 4.04-4.03h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42c1.63 1.63 3.87 2.64 6.36 2.64 4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08v-4.25h-1.5z\"/></g>\n<g id=\"room\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"rotation-3d\"><path d=\"M7.52 21.48c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.81-1.33 1.32zm.89-6.52c-.19 0-.37-.03-.52-.08-.16-.06-.29-.13-.4-.24-.11-.1-.2-.22-.26-.37-.06-.14-.09-.3-.09-.47h-1.3c0 .36.07.68.21.95.14.27.33.5.56.69.24.18.51.32.82.41.3.1.62.15.96.15.37 0 .72-.05 1.03-.15.32-.1.6-.25.83-.44s.42-.43.55-.72c.13-.29.2-.61.2-.97 0-.19-.02-.38-.07-.56-.05-.18-.12-.35-.23-.51-.1-.16-.24-.3-.4-.43-.17-.13-.37-.23-.61-.31.2-.09.37-.2.52-.33.15-.13.27-.27.37-.42.1-.15.17-.3.22-.46.05-.16.07-.32.07-.48 0-.36-.06-.68-.18-.96-.12-.28-.29-.51-.51-.69-.2-.19-.47-.33-.77-.43-.31-.09-.65-.14-1.02-.14-.36 0-.69.05-1 .16-.3.11-.57.26-.79.45-.21.19-.38.41-.51.67-.12.26-.18.54-.18.85h1.3c0-.17.03-.32.09-.45s.14-.25.25-.34c.11-.09.23-.17.38-.22.15-.05.3-.08.48-.08.4 0 .7.1.89.31.19.2.29.49.29.86 0 .18-.03.34-.08.49-.05.15-.14.27-.25.37-.11.1-.25.18-.41.24-.16.06-.36.09-.58.09h-.77v1.03h.77c.22 0 .42.02.6.07s.33.13.45.23c.12.11.22.24.29.4.07.16.1.35.1.57 0 .41-.12.72-.35.93-.23.23-.55.33-.95.33zm8.55-5.92c-.32-.33-.7-.59-1.14-.77-.43-.18-.92-.27-1.46-.27h-2.36v8h2.3c.55 0 1.06-.09 1.51-.27.45-.18.84-.43 1.16-.76.32-.33.57-.73.74-1.19.17-.47.26-.99.26-1.57v-.4c0-.58-.09-1.1-.26-1.57-.18-.47-.43-.87-.75-1.2zm-.39 3.16c0 .42-.05.79-.14 1.13-.1.33-.24.62-.43.85-.19.23-.43.41-.71.53-.29.12-.62.18-.99.18h-.91v-5.77h.97c.72 0 1.27.23 1.64.69.38.46.57 1.12.57 1.99v.4zm-4.57-12.2l-.66.03 3.81 3.81 1.33-1.33c3.27 1.55 5.61 4.72 5.96 8.48h1.5c-.5-6.15-5.65-10.99-11.94-10.99z\"/></g>\n<g id=\"save\"><path d=\"M17 3h-12c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-12l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10h-10v-4h10v4z\"/></g>\n<g id=\"schedule\"><path fill-opacity=\".9\" d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path fill-opacity=\".9\" d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g>\n<g id=\"search\"><path d=\"M15.5 14h-.79l-.28-.27c.98-1.14 1.57-2.62 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 2.91-6.5 6.5 2.91 6.5 6.5 6.5c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99 1.49-1.49-4.99-5zm-6 0c-2.49 0-4.5-2.01-4.5-4.5s2.01-4.5 4.5-4.5 4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5z\"/></g>\n<g id=\"select-all\"><path d=\"M3 5h2v-2c-1.1 0-2 .9-2 2zm0 8h2v-2h-2v2zm4 8h2v-2h-2v2zm-4-12h2v-2h-2v2zm10-6h-2v2h2v-2zm6 0v2h2c0-1.1-.9-2-2-2zm-14 18v-2h-2c0 1.1.9 2 2 2zm-2-4h2v-2h-2v2zm6-14h-2v2h2v-2zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2v-2h-2v2zm-8 12h10v-10h-10v10zm2-8h6v6h-6v-6z\"/></g>\n<g id=\"send-money\"><path d=\"M2 12c0-2.61 1.67-4.83 4-5.65v-2.09c-3.45.89-6 4.01-6 7.74s2.55 6.85 6 7.74v-2.09c-2.33-.82-4-3.04-4-5.65zm22 0l-4-4v3h-7v2h7v3l4-4zm-10 6c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.16.67 4.24 1.76l1.42-1.41c-1.45-1.45-3.45-2.35-5.66-2.35-4.42 0-8 3.58-8 8s3.58 8 8 8c2.21 0 4.21-.9 5.66-2.34l-1.42-1.41c-1.08 1.08-2.58 1.75-4.24 1.75z\"/></g>\n<g id=\"send\"><path d=\"M2.01 21l20.99-9-20.99-9-.01 7 15 2-15 2z\"/></g>\n<g id=\"settings-applications\"><path d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm7-7h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2v-14c0-1.1-.89-2-2-2zm-1.75 9c0 .23-.02.46-.05.68l1.48 1.16c.13.11.17.3.08.45l-1.4 2.42c-.09.15-.27.21-.43.15l-1.74-.7c-.36.28-.76.51-1.18.69l-.26 1.85c-.03.17-.18.3-.35.3h-2.8c-.17 0-.32-.13-.35-.29l-.26-1.85c-.43-.18-.82-.41-1.18-.69l-1.74.7c-.16.06-.34 0-.43-.15l-1.4-2.42c-.09-.15-.05-.34.08-.45l1.48-1.16c-.03-.23-.05-.46-.05-.69 0-.23.02-.46.05-.68l-1.48-1.16c-.13-.11-.17-.3-.08-.45l1.4-2.42c.09-.15.27-.21.43-.15l1.74.7c.36-.28.76-.51 1.18-.69l.26-1.85c.03-.17.18-.3.35-.3h2.8c.17 0 .32.13.35.29l.26 1.85c.43.18.82.41 1.18.69l1.74-.7c.16-.06.34 0 .43.15l1.4 2.42c.09.15.05.34-.08.45l-1.48 1.16c.03.23.05.46.05.69z\"/></g>\n<g id=\"settings-backup-restore\"><path d=\"M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9h-3l4 4 4-4h-3c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44c1.52 1.16 3.42 1.86 5.48 1.86 4.97 0 9-4.03 9-9s-4.03-9-9-9z\"/></g>\n<g id=\"settings-bluetooth\"><path d=\"M11 24h2v-2h-2v2zm-4 0h2v-2h-2v2zm8 0h2v-2h-2v2zm2.71-18.29l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"settings-cell\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm1-23.99l-8-.01c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-16c0-1.1-.9-1.99-2-1.99zm0 15.99h-8v-12h8v12z\"/></g>\n<g id=\"settings-display\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02zm-13-3.01h2.5l1.5 1.5 1.5-1.5h2.5v-2.5l1.5-1.5-1.5-1.5v-2.5h-2.5l-1.5-1.5-1.5 1.5h-2.5v2.5l-1.5 1.5 1.5 1.5v2.5zm4-7c1.66 0 3 1.34 3 3s-1.34 3-3 3v-6z\"/></g>\n<g id=\"settings-ethernet\"><path d=\"M7.77 6.76l-1.54-1.28-5.41 6.52 5.41 6.52 1.54-1.28-4.35-5.24 4.35-5.24zm-.77 6.24h2v-2h-2v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28 4.35 5.24-4.35 5.24 1.54 1.28 5.41-6.52-5.41-6.52z\"/></g>\n<g id=\"settings-input-antenna\"><path d=\"M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5c0 1.02.62 1.9 1.5 2.29v3.3l-3.41 3.41 1.41 1.41 3-3 3 3 1.41-1.41-3.41-3.41v-3.3zm-1-13.29c-6.07 0-11 4.93-11 11h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z\"/></g>\n<g id=\"settings-input-component\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g>\n<g id=\"settings-input-composite\"><path d=\"M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2zm-8 0c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.42 2-1.52 2-2.82v-2h-6v2zm20-10v-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6v-6h-2v-4zm4 14c0 1.3.84 2.4 2 2.82v4.18h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z\"/></g>\n<g id=\"settings-input-hdmi\"><path d=\"M18 7v-3c0-1.1-.9-2-2-2h-8c-1.1 0-2 .9-2 2v3h-1v6l3 6v3h8v-3l3-6v-6h-1zm-10-3h8v3h-2v-2h-1v2h-2v-2h-1v2h-2v-3z\"/></g>\n<g id=\"settings-input-svideo\"><path d=\"M8 11.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5.67 1.5 1.5 1.5 1.5-.67 1.5-1.5zm7-5c0-.83-.67-1.5-1.5-1.5h-3c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5h3c.83 0 1.5-.67 1.5-1.5zm-6.5 8.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm3.5-14c-6.07 0-11 4.93-11 11s4.93 11 11 11 11-4.93 11-11-4.93-11-11-11zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9zm5.5-11c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm-2 5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"/></g>\n<g id=\"settings-overscan\"><path d=\"M12.01 5.5l-2.01 2.5h4l-1.99-2.5zm5.99 4.5v4l2.5-1.99-2.5-2.01zm-12 0l-2.5 2.01 2.5 1.99v-4zm8 6h-4l2.01 2.5 1.99-2.5zm7-13h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"settings\"><path d=\"M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65c-.03-.24-.24-.42-.49-.42h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zm-7.43 2.52c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g>\n<g id=\"settings-phone\"><path d=\"M13 9h-2v2h2v-2zm4 0h-2v2h2v-2zm3 6.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-6.5v2h2v-2h-2z\"/></g>\n<g id=\"settings-power\"><path d=\"M7 24h2v-2h-2v2zm4 0h2v-2h-2v2zm2-22h-2v10h2v-10zm3.56 2.44l-1.45 1.45c1.73 1.05 2.89 2.94 2.89 5.11 0 3.31-2.69 6-6 6s-6-2.69-6-6c0-2.17 1.16-4.06 2.88-5.12l-1.44-1.44c-2.08 1.44-3.44 3.84-3.44 6.56 0 4.42 3.58 8 8 8s8-3.58 8-8c0-2.72-1.36-5.12-3.44-6.56zm-1.56 19.56h2v-2h-2v2z\"/></g>\n<g id=\"settings-remote\"><path d=\"M15 9h-6c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-3 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm-4.95-8.95l1.41 1.41c.91-.9 2.16-1.46 3.54-1.46s2.63.56 3.54 1.46l1.41-1.41c-1.27-1.27-3.02-2.05-4.95-2.05s-3.68.78-4.95 2.05zm4.95-6.05c-3.04 0-5.79 1.23-7.78 3.22l1.41 1.41c1.63-1.62 3.88-2.63 6.37-2.63s4.74 1.01 6.36 2.64l1.41-1.41c-1.98-2-4.73-3.23-7.77-3.23z\"/></g>\n<g id=\"settings-voice\"><path d=\"M7 24h2v-2h-2v2zm5-11c1.66 0 2.99-1.34 2.99-3l.01-6c0-1.66-1.34-3-3-3s-3 1.34-3 3v6c0 1.66 1.34 3 3 3zm-1 11h2v-2h-2v2zm4 0h2v-2h-2v2zm4-14h-1.7c0 3-2.54 5.1-5.3 5.1s-5.3-2.1-5.3-5.1h-1.7c0 3.41 2.72 6.23 6 6.72v3.28h2v-3.28c3.28-.49 6-3.31 6-6.72z\"/></g>\n<g id=\"shop\"><path d=\"M16 6v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-6v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-13h-6zm-6-2h4v2h-4v-2zm-1 14v-9l7.5 4-7.5 5z\"/></g>\n<g id=\"shopping-basket\"><path d=\"M17.21 9l-4.38-6.56c-.19-.28-.51-.42-.83-.42-.32 0-.64.14-.83.43l-4.38 6.55h-4.79c-.55 0-1 .45-1 1 0 .09.01.18.04.27l2.54 9.27c.23.84 1 1.46 1.92 1.46h13c.92 0 1.69-.62 1.93-1.46l2.54-9.27.03-.27c0-.55-.45-1-1-1h-4.79zm-8.21 0l3-4.4 3 4.4h-6zm3 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"shopping-cart\"><path d=\"M7 18c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-6-16v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1h-14.79l-.94-2h-3.27zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"shop-two\"><path d=\"M3 9h-2v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2h-16v-11zm15-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-5v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2v-11h-5zm-6-2h4v2h-4v-2zm0 12v-7l5.5 3-5.5 4z\"/></g>\n<g id=\"sort\"><path d=\"M3 18h6v-2h-6v2zm0-12v2h18v-2h-18zm0 7h12v-2h-12v2z\"/></g>\n<g id=\"speaker-notes\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-12 12h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2v-2h2v2zm7 6h-5v-2h5v2zm3-3h-8v-2h8v2zm0-3h-8v-2h8v2z\"/></g>\n<g id=\"spellcheck\"><path d=\"M12.45 16h2.09l-5.11-13h-1.86l-5.11 13h2.09l1.12-3h5.64l1.14 3zm-6.02-5l2.07-5.52 2.07 5.52h-4.14zm15.16.59l-8.09 8.09-3.67-3.68-1.41 1.41 5.09 5.09 9.49-9.5-1.41-1.41z\"/></g>\n<g id=\"star-half\"><path d=\"M22 9.74l-7.19-.62L12 2.5 9.19 9.13 2 9.74l5.46 4.73-1.64 7.03L12 17.77l6.18 3.73-1.63-7.03L22 9.74zM12 15.9V6.6l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.9z\"/></g>\n<g id=\"star-outline\"><path d=\"M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z\"/></g>\n<g id=\"star\"><path d=\"M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"/></g>\n<g id=\"star-rate\"><path d=\"M12 14.3l3.71 2.7-1.42-4.36 3.71-2.64h-4.55l-1.45-4.5-1.45 4.5h-4.55l3.71 2.64-1.42 4.36z\"/></g>\n<g id=\"stars\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm4.24 16l-4.23-2.55-4.23 2.55 1.12-4.81-3.73-3.23 4.92-.42 1.92-4.54 1.92 4.53 4.92.42-3.73 3.23 1.12 4.82z\"/></g>\n<g id=\"store\"><path d=\"M20 4h-16v2h16v-2zm1 10v-2l-1-5h-16l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4h-6v-4h6v4z\"/></g>\n<g id=\"subject\"><path d=\"M14 17h-10v2h10v-2zm6-8h-16v2h16v-2zm-16 6h16v-2h-16v2zm0-10v2h16v-2h-16z\"/></g>\n<g id=\"supervisor-account\"><circle cx=\"12\" cy=\"13.49\" r=\"1.5\"/><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 2.5c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25-2.25-1.01-2.25-2.25 1.01-2.25 2.25-2.25zm5 10.56v2.5c-.45.41-.96.77-1.5 1.05v-.68c0-.34-.17-.65-.46-.92-.65-.62-1.89-1.02-3.04-1.02-.96 0-1.96.28-2.65.73l-.17.12-.21.17c.78.47 1.63.72 2.54.82l1.33.15c.37.04.66.36.66.75 0 .29-.16.53-.4.66-.28.15-.64.09-.95.09-.35 0-.69-.01-1.03-.05-.5-.06-.99-.17-1.46-.33-.49-.16-.97-.38-1.42-.64-.22-.13-.44-.27-.65-.43l-.31-.24c-.04-.02-.28-.18-.28-.23v-4.28c0-1.58 2.63-2.78 5-2.78s5 1.2 5 2.78v1.78z\"/></g>\n<g id=\"swap-horiz\"><path d=\"M6.99 11l-3.99 4 3.99 4v-3h7.01v-2h-7.01v-3zm14.01-2l-3.99-4v3h-7.01v2h7.01v3l3.99-4z\"/></g>\n<g id=\"swap-vert-circle\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-5.5 7l3.5-3.5 3.5 3.5h-2.5v4h-2v-4h-2.5zm11 6l-3.5 3.5-3.5-3.5h2.5v-4h2v4h2.5z\"/></g>\n<g id=\"swap-vert\"><path d=\"M16 17.01v-7.01h-2v7.01h-3l4 3.99 4-3.99h-3zm-7-14.01l-4 3.99h3v7.01h2v-7.01h3l-4-3.99z\"/></g>\n<g id=\"system-update-tv\"><path d=\"M12 16.5l4-4h-3v-9h-2v9h-3l4 4zm9-13h-6v1.99h6v14.03h-18v-14.03h6v-1.99h-6c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"tab\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-18v-14h10v4h8v10z\"/></g>\n<g id=\"tab-unselected\"><path d=\"M1 9h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2c-1.1 0-2 .9-2 2zm8 16h2v-2h-2v2zm-8-4h2v-2h-2v2zm2 4v-2h-2c0 1.1.9 2 2 2zm18-18h-8v6h10v-4c0-1.1-.9-2-2-2zm0 14h2v-2h-2v2zm-12-12h2v-2h-2v2zm-4 16h2v-2h-2v2zm0-16h2v-2h-2v2zm16 16c1.1 0 2-.9 2-2h-2v2zm0-8h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 0h2v-2h-2v2z\"/></g>\n<g id=\"text-format\"><path d=\"M5 17v2h14v-2h-14zm4.5-4.2h5l.9 2.2h2.1l-4.75-11h-1.5l-4.75 11h2.1l.9-2.2zm2.5-6.82l1.87 5.02h-3.74l1.87-5.02z\"/></g>\n<g id=\"theaters\"><path d=\"M18 3v2h-2v-2h-8v2h-2v-2h-2v18h2v-2h2v2h8v-2h2v2h2v-18h-2zm-10 14h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g>\n<g id=\"thumb-down\"><path d=\"M15 3h-9c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v1.91l.01.01-.01.08c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06l1.06 1.05 6.59-6.59c.36-.36.58-.86.58-1.41v-10c0-1.1-.9-2-2-2zm4 0v12h4v-12h-4z\"/></g>\n<g id=\"thumbs-up-down\"><path d=\"M12 6c0-.55-.45-1-1-1h-5.18l.66-3.18.02-.23c0-.31-.13-.59-.33-.8l-.79-.79-4.94 4.94c-.27.27-.44.65-.44 1.06v6.5c0 .83.67 1.5 1.5 1.5h6.75c.62 0 1.15-.38 1.38-.91l2.26-5.29c.07-.17.11-.36.11-.55v-1.25zm10.5 4h-6.75c-.62 0-1.15.38-1.38.91l-2.26 5.29c-.07.17-.11.36-.11.55v1.25c0 .55.45 1 1 1h5.18l-.66 3.18-.02.24c0 .31.13.59.33.8l.79.78 4.94-4.94c.27-.27.44-.65.44-1.06v-6.5c0-.83-.67-1.5-1.5-1.5z\"/></g>\n<g id=\"thumb-up\"><path d=\"M1 21h4v-12h-4v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06l-1.06-1.05-6.58 6.59c-.37.36-.59.86-.59 1.41v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01.01-.08z\"/></g>\n<g id=\"toc\"><path d=\"M3 9h14v-2h-14v2zm0 4h14v-2h-14v2zm0 4h14v-2h-14v2zm16 0h2v-2h-2v2zm0-10v2h2v-2h-2zm0 6h2v-2h-2v2z\"/></g>\n<g id=\"today\"><path d=\"M19 3h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11zm-12-9h5v5h-5z\"/></g>\n<g id=\"track-changes\"><path d=\"M19.07 4.93l-1.41 1.41c1.44 1.45 2.34 3.45 2.34 5.66 0 4.42-3.58 8-8 8s-8-3.58-8-8c0-4.08 3.05-7.44 7-7.93v2.02c-2.84.48-5 2.94-5 5.91 0 3.31 2.69 6 6 6s6-2.69 6-6c0-1.66-.67-3.16-1.76-4.24l-1.41 1.41c.72.73 1.17 1.73 1.17 2.83 0 2.21-1.79 4-4 4s-4-1.79-4-4c0-1.86 1.28-3.41 3-3.86v2.14c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72v-8.28h-1c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10c0-2.76-1.12-5.26-2.93-7.07z\"/></g>\n<g id=\"translate\"><path d=\"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53h2.93v-2h-7v-2h-2v2h-7v1.99h11.17c-.67 1.93-1.73 3.76-3.17 5.36-.93-1.03-1.7-2.16-2.31-3.35h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02 1.42 1.42 5-5 3.11 3.11.76-2.04zm5.63-5.07h-2l-4.5 12h2l1.12-3h4.75l1.13 3h2l-4.5-12zm-2.62 7l1.62-4.33 1.62 4.33h-3.24z\"/></g>\n<g id=\"trending-down\"><path d=\"M16 18l2.29-2.29-4.88-4.88-4 4-7.41-7.42 1.41-1.41 6 6 4-4 6.3 6.29 2.29-2.29v6z\"/></g>\n<g id=\"trending-neutral\"><path d=\"M22 12l-4-4v3h-15v2h15v3z\"/></g>\n<g id=\"trending-up\"><path d=\"M16 6l2.29 2.29-4.88 4.88-4-4-7.41 7.42 1.41 1.41 6-6 4 4 6.3-6.29 2.29 2.29v-6z\"/></g>\n<g id=\"turned-in-not\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2zm0 15l-5-2.18-5 2.18v-13h10v13z\"/></g>\n<g id=\"turned-in\"><path d=\"M17 3h-10c-1.1 0-1.99.9-1.99 2l-.01 16 7-3 7 3v-16c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"undo\"><path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6l-3.6-3.6v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78c-1.39-4.19-5.32-7.22-9.97-7.22z\"/></g>\n<g id=\"unfold-less\"><path d=\"M7.41 18.59l1.42 1.41 3.17-3.17 3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59zm9.18-13.18l-1.42-1.41-3.17 3.17-3.17-3.17-1.42 1.41 4.59 4.59 4.59-4.59z\"/></g>\n<g id=\"unfold-more\"><path d=\"M12 5.83l3.17 3.17 1.41-1.41-4.58-4.59-4.59 4.59 1.42 1.41 3.17-3.17zm0 12.34l-3.17-3.17-1.41 1.41 4.58 4.59 4.59-4.59-1.42-1.41-3.17 3.17z\"/></g>\n<g id=\"verified-user\"><path d=\"M12 1l-9 4v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12v-6l-9-4zm-2 16l-4-4 1.41-1.41 2.59 2.58 6.59-6.59 1.41 1.42-8 8z\"/></g>\n<g id=\"view-agenda\"><path d=\"M20 13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm0-10h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1z\"/></g>\n<g id=\"view-array\"><path d=\"M4 18h3v-13h-3v13zm14-13v13h3v-13h-3zm-10 13h9v-13h-9v13z\"/></g>\n<g id=\"view-carousel\"><path d=\"M7 19h10v-15h-10v15zm-5-2h4v-11h-4v11zm16-11v11h4v-11h-4z\"/></g>\n<g id=\"view-column\"><path d=\"M10 18h5v-13h-5v13zm-6 0h5v-13h-5v13zm12-13v13h5v-13h-5z\"/></g>\n<g id=\"view-day\"><path d=\"M2 21h19v-3h-19v3zm18-13h-17c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm-18-5v3h19v-3h-19z\"/></g>\n<g id=\"view-headline\"><path d=\"M4 15h17v-2h-17v2zm0 4h17v-2h-17v2zm0-8h17v-2h-17v2zm0-6v2h17v-2h-17z\"/></g>\n<g id=\"view-list\"><path d=\"M4 14h4v-4h-4v4zm0 5h4v-4h-4v4zm0-10h4v-4h-4v4zm5 5h12v-4h-12v4zm0 5h12v-4h-12v4zm0-14v4h12v-4h-12z\"/></g>\n<g id=\"view-module\"><path d=\"M4 11h5v-6h-5v6zm0 7h5v-6h-5v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5v-6h-5v6zm6-6v6h5v-6h-5z\"/></g>\n<g id=\"view-quilt\"><path d=\"M10 18h5v-6h-5v6zm-6 0h5v-13h-5v13zm12 0h5v-6h-5v6zm-6-13v6h11v-6h-11z\"/></g>\n<g id=\"view-stream\"><path d=\"M4 18h17v-6h-17v6zm0-13v6h17v-6h-17z\"/></g>\n<g id=\"view-week\"><path d=\"M6 5h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-12c0-.55-.45-1-1-1z\"/></g>\n<g id=\"visibility-off\"><path d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16c.57-.23 1.18-.36 1.83-.36zm-10-2.73l2.28 2.28.46.46c-1.66 1.29-2.96 3.01-3.74 4.99 1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42 2.93 2.92 1.27-1.27-17.73-17.73-1.27 1.27zm5.53 5.53l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"/></g>\n<g id=\"visibility\"><path d=\"M12 4.5c-5 0-9.27 3.11-11 7.5 1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"wallet-giftcard\"><path d=\"M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68c-.54-.8-1.45-1.34-2.5-1.34-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.18c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-6 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15h-16v-2h16v2zm0-5h-16v-6h5.08l-2.08 2.83 1.62 1.17 2.38-3.24 1-1.36 1 1.36 2.38 3.24 1.62-1.17-2.08-2.83h5.08v6z\"/></g>\n<g id=\"wallet-membership\"><path d=\"M20 2h-16c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h4v5l4-2 4 2v-5h4c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm0 13h-16v-2h16v2zm0-5h-16v-6h16v6z\"/></g>\n<g id=\"wallet-travel\"><path d=\"M20 6h-3v-2c0-1.11-.89-2-2-2h-6c-1.11 0-2 .89-2 2v2h-3c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-11-2h6v2h-6v-2zm11 15h-16v-2h16v2zm0-5h-16v-6h3v2h2v-2h6v2h2v-2h3v6z\"/></g>\n<g id=\"warning\"><path d=\"M1 21h22l-11-19-11 19zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g>\n<g id=\"work\"><path d=\"M24 0v24h-24v-24h24m1-1h-26v26h26v-26z\"/><path d=\"M20 6h-4v-2c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-6 0h-4v-2h4v2z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<html>\n<head>\n\n  <title>core-icons</title>\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <!-- load default set -->\n  <link rel=\"import\" href=\"core-icons.html\">\n  <!-- load the rest -->\n  <link rel=\"import\" href=\"av-icons.html\">\n  <link rel=\"import\" href=\"communication-icons.html\">\n  <link rel=\"import\" href=\"device-icons.html\">\n  <link rel=\"import\" href=\"editor-icons.html\">\n  <link rel=\"import\" href=\"hardware-icons.html\">\n  <link rel=\"import\" href=\"image-icons.html\">\n  <link rel=\"import\" href=\"maps-icons.html\">\n  <link rel=\"import\" href=\"notification-icons.html\">\n  <link rel=\"import\" href=\"social-icons.html\">\n  <style>\n    body {\n      font-family: 'Helvetica Neue', Helvetica, Arial;\n    }\n\n    h2 {\n      text-transform: capitalize;\n    }\n\n    core-icon {\n      transition: all 0.2s;\n      -webkit-transition: all 0.2s;\n    }\n\n    core-icon:hover {\n      fill: #fb8c00;\n    }\n\n    .set {\n      padding: 1em 0;\n      border-bottom: 1px solid silver;\n    }\n\n    .set:nth-of-type(4n-3) {\n      color: #656565;\n    }\n\n    .set:nth-of-type(4n-2) {\n      color: #FDD835;\n    }\n\n    .set:nth-of-type(4n-1) {\n      color: #0D904F;\n    }\n\n    .set:nth-of-type(4n) {\n      color: #3B78E7;\n    }\n\n    .container {\n      min-width: 10em;\n      padding: 1em;\n    }\n\n    .container > div {\n      color: black;\n    }\n  </style>\n</head>\n<body unresolved>\n\n  <template is=\"auto-binding\">\n    <template repeat=\"{{iconset in $.meta.metaArray}}\">\n      <h2>{{iconset.id}}</h2>\n      <h5>{{iconset.id === 'icons' ? 'The Default Set' : 'Import ' + iconset.id + '-icons.html'}}</h5>\n      <div class=\"set\" horizontal wrap justified layout>\n        <template repeat=\"{{ icon in iconset.iconNames }}\">\n          <span class=\"container\" vertical center layout>\n            <core-icon icon=\"{{ iconset.id }}:{{ icon }}\"></core-icon>\n            <div>{{ icon }}</div>\n          </span>\n        </template>\n      </div>\n    </template>\n    <core-iconset id=\"meta\"></core-iconset>\n  </template>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/device-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"device\" iconSize=\"24\">\n<svg><defs>\n<g id=\"access-alarm\"><path d=\"M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-14.12-2.33l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm4.62 4.61h-1.5v6l4.75 2.85.75-1.23-4-2.37v-5.25zm-.5-4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"access-alarms\"><path d=\"M22 5.7l-4.6-3.9-1.3 1.5 4.6 3.9 1.3-1.5zm-14.1-2.3l-1.3-1.5-4.6 3.8 1.3 1.5 4.6-3.8zm4.6 4.6h-1.5v6l4.7 2.9.8-1.2-4-2.4v-5.3zm-.5-4c-5 0-9 4-9 9s4 9 9 9 9-4 9-9-4-9-9-9zm0 16c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7z\"/></g>\n<g id=\"access-time\"><path fill-opacity=\".9\" d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path fill-opacity=\".9\" d=\"M12.5 7h-1.5v6l5.25 3.15.75-1.23-4.5-2.67z\"/></g>\n<g id=\"add-alarm\"><path d=\"M7.88 3.39l-1.28-1.53-4.6 3.85 1.29 1.53 4.59-3.85zm14.12 2.33l-4.6-3.86-1.29 1.53 4.6 3.86 1.29-1.53zm-10-1.72c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3h-3v2h3v3h2v-3h3v-2h-3v-3z\"/></g>\n<g id=\"airplanemode-off\"><path d=\"M13 9v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v3.68l7.83 7.83 3.17.99v-2l-8-5zm-10-3.73l4.99 4.99-5.99 3.74v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-3.73l5.73 5.73 1.27-1.27-15.73-15.73-1.27 1.27z\"/></g>\n<g id=\"airplanemode-on\"><path d=\"M10.18 9\"/><path d=\"M21 16v-2l-8-5v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z\"/></g>\n<g id=\"battery-20\"><path d=\"M7 17v3.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-3.67h-10z\"/><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v11.67h10v-11.67z\"/></g>\n<g id=\"battery-30\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v9.67h10v-9.67z\"/><path d=\"M7 15v5.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-5.67h-10z\"/></g>\n<g id=\"battery-50\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v7.67h10v-7.67z\"/><path d=\"M7 13v7.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-7.67h-10z\"/></g>\n<g id=\"battery-60\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v5.67h10v-5.67z\"/><path d=\"M7 11v9.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-9.67h-10z\"/></g>\n<g id=\"battery-80\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v3.67h10v-3.67z\"/><path d=\"M7 9v11.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-11.67h-10z\"/></g>\n<g id=\"battery-90\"><path fill-opacity=\".3\" d=\"M17 5.33c0-.73-.6-1.33-1.33-1.33h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v2.67h10v-2.67z\"/><path d=\"M7 8v12.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-12.67h-10z\"/></g>\n<g id=\"battery-alert\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33zm-2.67 14h-2v-2h2v2zm0-4h-2v-5h2v5z\"/></g>\n<g id=\"battery-charging-20\"><path d=\"M11 20v-3h-4v3.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-3.67h-4.4l-1.6 3z\"/><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v11.67h4v-2.5h-2l4-7.5v5.5h2l-2.4 4.5h4.4v-11.67c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-charging-30\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v9.17h2l4-7.5v5.5h2l-1.07 2h3.07v-9.17c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M11 20v-5.5h-4v6.17c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-6.17h-3.07l-2.93 5.5z\"/></g>\n<g id=\"battery-charging-50\"><path d=\"M14.47 13.5l-3.47 6.5v-5.5h-2l.53-1h-2.53v7.17c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-7.17h-2.53z\"/><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v8.17h2.53l3.47-6.5v5.5h2l-.53 1h2.53v-8.17c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-charging-60\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v5.67h3.87l2.13-4v4h4v-5.67c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M13 12.5h2l-4 7.5v-5.5h-2l1.87-3.5h-3.87v9.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-9.67h-4v1.5z\"/></g>\n<g id=\"battery-charging-80\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v3.67h4.93l1.07-2v2h4v-3.67c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M13 12.5h2l-4 7.5v-5.5h-2l2.93-5.5h-4.93v11.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-11.67h-4v3.5z\"/></g>\n<g id=\"battery-charging-90\"><path fill-opacity=\".3\" d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v2.67h5.47l.53-1v1h4v-2.67c0-.73-.6-1.33-1.33-1.33z\"/><path d=\"M13 12.5h2l-4 7.5v-5.5h-2l3.47-6.5h-5.47v12.67c0 .73.6 1.33 1.33 1.33h7.33c.74 0 1.34-.6 1.34-1.33v-12.67h-4v4.5z\"/></g>\n<g id=\"battery-charging-full\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33zm-4.67 16v-5.5h-2l4-7.5v5.5h2l-4 7.5z\"/></g>\n<g id=\"battery-full\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-std\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33z\"/></g>\n<g id=\"battery-unknown\"><path d=\"M15.67 4h-1.67v-2h-4v2h-1.67c-.73 0-1.33.6-1.33 1.33v15.33c0 .74.6 1.34 1.33 1.34h7.33c.74 0 1.34-.6 1.34-1.33v-15.34c0-.73-.6-1.33-1.33-1.33zm-2.72 13.95h-1.9v-1.9h1.9v1.9zm1.35-5.26s-.38.42-.67.71c-.48.48-.83 1.15-.83 1.6h-1.6c0-.83.46-1.52.93-2l.93-.94c.27-.27.44-.65.44-1.06 0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5h-1.5c0-1.66 1.34-3 3-3s3 1.34 3 3c0 .66-.27 1.26-.7 1.69z\"/></g>\n<g id=\"bluetooth\"><path d=\"M17.71 7.71l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"bluetooth-connected\"><path d=\"M7 12l-2-2-2 2 2 2 2-2zm10.71-4.29l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88zm4.12-6.29l-2 2 2 2 2-2-2-2z\"/></g>\n<g id=\"bluetooth-disabled\"><path d=\"M13 5.83l1.88 1.88-1.6 1.6 1.41 1.41 3.02-3.02-5.71-5.7h-1v5.03l2 2v-3.2zm-7.59-1.83l-1.41 1.41 6.59 6.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l4.29-4.29 2.3 2.29 1.41-1.41-14.59-14.59zm7.59 14.17v-3.76l1.88 1.88-1.88 1.88z\"/></g>\n<g id=\"bluetooth-searching\"><path d=\"M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"brightness-auto\"><path d=\"M10.85 12.65h2.3l-1.15-3.65-1.15 3.65zm9.15-3.96v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-5.7 7.31l-.7-2h-3.2l-.7 2h-1.9l3.2-9h2l3.2 9h-1.9z\"/></g>\n<g id=\"brightness-high\"><path d=\"M20 8.69v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-8 9.31c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z\"/></g>\n<g id=\"brightness-low\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z\"/></g>\n<g id=\"brightness-medium\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69v-12c3.31 0 6 2.69 6 6s-2.69 6-6 6z\"/></g>\n<g id=\"data-usage\"><path d=\"M13 2.05v3.03c3.39.49 6 3.39 6 6.92 0 .9-.18 1.75-.48 2.54l2.6 1.53c.56-1.24.88-2.62.88-4.07 0-5.18-3.95-9.45-9-9.95zm-1 16.95c-3.87 0-7-3.13-7-7 0-3.53 2.61-6.43 6-6.92v-3.03c-5.06.5-9 4.76-9 9.95 0 5.52 4.47 10 9.99 10 3.31 0 6.24-1.61 8.06-4.09l-2.6-1.53c-1.28 1.6-3.24 2.62-5.45 2.62z\"/></g>\n<g id=\"developer-mode\"><path d=\"M7 5h10v2h2v-4c0-1.1-.9-1.99-2-1.99l-10-.01c-1.1 0-2 .9-2 2v4h2v-2zm8.41 11.59l4.59-4.59-4.59-4.59-1.41 1.42 3.17 3.17-3.17 3.17 1.41 1.42zm-5.41-1.42l-3.17-3.17 3.17-3.17-1.41-1.42-4.59 4.59 4.59 4.59 1.41-1.42zm7 3.83h-10v-2h-2v4c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-4h-2v2z\"/></g>\n<g id=\"devices\"><path d=\"M4 6h18v-2h-18c-1.1 0-2 .9-2 2v11h-2v3h14v-3h-10v-11zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-10c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z\"/></g>\n<g id=\"dvr\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2l.01-12c0-1.1-.9-2-2-2zm0 14h-18v-12h18v12zm-2-9h-11v2h11v-2zm0 4h-11v2h11v-2zm-12-4h-2v2h2v-2zm0 4h-2v2h2v-2z\"/></g>\n<g id=\"gps-fixed\"><path d=\"M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"gps-not-fixed\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"gps-off\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5c.82-.34 1.72-.53 2.66-.53 3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15h2.05v-2h-2.06zm-17.94-6.73l2.04 2.04c-1.07 1.31-1.79 2.92-1.98 4.69h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c1.77-.2 3.38-.91 4.69-1.98l2.04 2.04 1.27-1.27-16.73-16.73-1.27 1.27zm13.27 13.27c-1.18.91-2.66 1.46-4.27 1.46-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z\"/></g>\n<g id=\"location-disabled\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5c.82-.34 1.72-.53 2.66-.53 3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15h2.05v-2h-2.06zm-17.94-6.73l2.04 2.04c-1.07 1.31-1.79 2.92-1.98 4.69h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c1.77-.2 3.38-.91 4.69-1.98l2.04 2.04 1.27-1.27-16.73-16.73-1.27 1.27zm13.27 13.27c-1.18.91-2.66 1.46-4.27 1.46-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z\"/></g>\n<g id=\"location-searching\"><path d=\"M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"multitrack-audio\"><path d=\"M7 18h2v-12h-2v12zm4 4h2v-20h-2v20zm-8-8h2v-4h-2v4zm12 4h2v-12h-2v12zm4-8v4h2v-4h-2z\"/></g>\n<g id=\"network-cell\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M17 7l-15 15h15z\"/></g>\n<g id=\"network-wifi\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54c-.43-.33-3.66-2.95-8.47-2.95-4.81 0-8.04 2.62-8.47 2.95z\"/></g>\n<g id=\"nfc\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm0 18h-16v-16h16v16zm-2-14h-5c-1.1 0-2 .9-2 2v2.28c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72v-2.28h3v8h-8v-8h2v-2h-4v12h12v-12z\"/></g>\n<g id=\"now-wallpaper\"><path d=\"M4 4h7v-2h-7c-1.1 0-2 .9-2 2v7h2v-7zm6 9l-4 5h12l-3-4-2.03 2.71-2.97-3.71zm7-4.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5.67 1.5 1.5 1.5 1.5-.67 1.5-1.5zm3-6.5h-7v2h7v7h2v-7c0-1.1-.9-2-2-2zm0 18h-7v2h7c1.1 0 2-.9 2-2v-7h-2v7zm-16-7h-2v7c0 1.1.9 2 2 2h7v-2h-7v-7z\"/></g>\n<g id=\"now-widgets\"><path d=\"M13 13v8h8v-8h-8zm-10 8h8v-8h-8v8zm0-18v8h8v-8h-8zm13.66-1.31l-5.66 5.65 5.66 5.66 5.66-5.66-5.66-5.65z\"/></g>\n<g id=\"screen-lock-landscape\"><path d=\"M21 5h-18c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-2 12h-14v-10h14v10zm-9-1h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1z\"/></g>\n<g id=\"screen-lock-portrait\"><path d=\"M10 16h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1zm6.2-9h-10c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-2-2-2zm0 18h-10v-14h10v14z\"/></g>\n<g id=\"screen-lock-rotation\"><path d=\"M23.25 12.77l-2.57-2.57-1.41 1.41 2.22 2.22-5.66 5.66-11.32-11.32 5.66-5.66 2.1 2.1 1.41-1.41-2.45-2.45c-.59-.59-1.54-.59-2.12 0l-6.36 6.36c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12zm-14.78 7.71c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.82-1.33 1.33zm7.53-11.48h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1v-.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1zm.8-6.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7v.5h-3.4v-.5z\"/></g>\n<g id=\"screen-rotation\"><path d=\"M16.48 2.52c3.27 1.55 5.61 4.72 5.97 8.48h1.5c-.51-6.16-5.66-11-11.95-11l-.66.03 3.81 3.81 1.33-1.32zm-6.25-.77c-.59-.59-1.54-.59-2.12 0l-6.36 6.36c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12l-12.02-12.02zm4.6 19.44l-12.02-12.02 6.36-6.36 12.02 12.02-6.36 6.36zm-7.31.29c-3.27-1.54-5.61-4.72-5.97-8.48h-1.5c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.81-1.33 1.32z\"/></g>\n<g id=\"sd-storage\"><path d=\"M18 2h-8l-5.98 6-.02 12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-6 6h-2v-4h2v4zm3 0h-2v-4h2v4zm3 0h-2v-4h2v4z\"/></g>\n<g id=\"settings-system-daydream\"><path d=\"M9 16h6.5c1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5h-.05c-.24-1.69-1.69-3-3.45-3-1.4 0-2.6.83-3.16 2.02h-.16c-1.51.16-2.68 1.43-2.68 2.98 0 1.66 1.34 3 3 3zm12-13h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"signal-cellular-0-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/></g>\n<g id=\"signal-cellular-1-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M12 12l-10 10h10z\"/></g>\n<g id=\"signal-cellular-2-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M14 10l-12 12h12z\"/></g>\n<g id=\"signal-cellular-3-bar\"><path fill-opacity=\".3\" d=\"M2 22h20v-20z\"/><path d=\"M17 7l-15 15h15z\"/></g>\n<g id=\"signal-cellular-4-bar\"><path d=\"M2 22h20v-20z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-0-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M20 22h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-1-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M20 10v8h2v-8h-2zm-8 12v-10l-10 10h10zm8 0h2v-2h-2v2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-2-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M14 22v-12l-12 12h12zm6-12v8h2v-8h-2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-3-bar\"><path fill-opacity=\".3\" d=\"M22 8v-6l-20 20h16v-14z\"/><path d=\"M17 22v-15l-15 15h15zm3-12v8h2v-8h-2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"signal-cellular-connected-no-internet-4-bar\"><path d=\"M20 18h2v-8h-2v8zm0 4h2v-2h-2v2zm-18 0h16v-14h4v-6l-20 20z\"/></g>\n<g id=\"signal-cellular-no-sim\"><path d=\"M18.99 5c0-1.1-.89-2-1.99-2h-7l-2.34 2.34 11.34 11.34-.01-11.68zm-15.34-1.12l-1.27 1.27 2.62 2.62v11.23c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27-17.47-17.47z\"/></g>\n<g id=\"signal-cellular-null\"><path d=\"M20 6.83v13.17h-13.17l13.17-13.17m2-4.83l-20 20h20v-20z\"/></g>\n<g id=\"signal-cellular-off\"><path d=\"M21 1l-8.59 8.59 8.59 8.59v-17.18zm-16.23 3.5l-1.27 1.27 6.36 6.36-8.86 8.87h17.73l2 2 1.27-1.27-17.23-17.23z\"/></g>\n<g id=\"signal-wifi-0-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/></g>\n<g id=\"signal-wifi-1-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M6.67 14.86l5.33 6.63v.01l.01-.01 5.33-6.63c-.28-.21-2.31-1.86-5.34-1.86s-5.06 1.65-5.33 1.86z\"/></g>\n<g id=\"signal-wifi-2-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M4.79 12.52l7.2 8.98h.01l.01-.01 7.2-8.98c-.36-.27-3.11-2.51-7.21-2.51s-6.85 2.24-7.21 2.52z\"/></g>\n<g id=\"signal-wifi-3-bar\"><path fill-opacity=\".3\" d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/><path d=\"M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54c-.43-.33-3.66-2.95-8.47-2.95-4.81 0-8.04 2.62-8.47 2.95z\"/></g>\n<g id=\"signal-wifi-4-bar\"><path d=\"M12.01 21.49l11.63-14.49c-.45-.34-4.93-4-11.64-4-6.72 0-11.19 3.66-11.64 4l11.63 14.49.01.01.01-.01z\"/></g>\n<g id=\"signal-wifi-off\"><path d=\"M23.64 7c-.45-.34-4.93-4-11.64-4-1.5 0-2.89.19-4.15.48l10.33 10.32 5.46-6.8zm-6.6 8.22l-13.77-13.78-1.27 1.28 2.05 2.06c-2.14.98-3.46 2.04-3.69 2.22l11.63 14.49.01.01.01-.01 3.9-4.86 3.32 3.32 1.27-1.27-3.46-3.46z\"/></g>\n<g id=\"signal-wifi-statusbar-1-bar\"><path d=\"M13 21.99l5.66-7.05c-.22-.16-2.39-1.94-5.66-1.94s-5.44 1.78-5.66 1.95l5.66 7.04z\"/><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/></g>\n<g id=\"signal-wifi-statusbar-2-bar\"><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/><path d=\"M13.01 21.99l7.54-9.4c-.29-.21-3.19-2.59-7.55-2.59-4.36 0-7.26 2.38-7.55 2.59l7.54 9.4h.02z\"/></g>\n<g id=\"signal-wifi-statusbar-3-bar\"><path d=\"M13.01 21.99l9.43-11.75c-.37-.27-4-3.24-9.44-3.24-5.44 0-9.07 2.97-9.44 3.24l9.43 11.75h.02z\"/><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/></g>\n<g id=\"signal-wifi-statusbar-4-bar\"><path d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-1\"><path fill-opacity=\".3\" d=\"M24.24 8l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24z\"/><path d=\"M7.34 14.95l5.66 7.04v.01-.01l5.66-7.05c-.22-.16-2.39-1.94-5.66-1.94s-5.44 1.78-5.66 1.95zm14.66 7.05h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-2\"><path fill-opacity=\".3\" d=\"M24.24 8l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24z\"/><path d=\"M5.45 12.59l7.54 9.4.01.01.01-.01 6.99-8.71v-1.09c-1.07-.73-3.59-2.19-7-2.19-4.36 0-7.26 2.38-7.55 2.59zm16.55-2.59v8h2v-8h-2zm0 12h2v-2h-2v2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet\"><path fill-opacity=\".3\" d=\"M24.24 8l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24z\"/><path d=\"M22 22h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-3\"><path d=\"M13.01 21.99l9.43-11.75c-.37-.27-4-3.24-9.44-3.24-5.44 0-9.07 2.97-9.44 3.24l9.43 11.75h.02z\"/><path fill-opacity=\".3\" d=\"M13.01 21.99l12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01z\"/><path d=\"M20 16.27v-8.27h6.64\"/><path d=\"M22 22h2v-2h-2v2zm0-12v8h2v-8h-2z\"/></g>\n<g id=\"signal-wifi-statusbar-connected-no-internet-4\"><path d=\"M22 22h2v-2h-2v2zm-9-20c-7.26 0-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 6.99-8.71v-5.28h4.24l1.35-1.68c-.49-.36-5.33-4.32-12.59-4.32zm9 16h2v-8h-2v8z\"/></g>\n<g id=\"signal-wifi-statusbar-not-connected\"><path fill-opacity=\".3\" d=\"M21 8.5c.85 0 1.64.23 2.34.62l2.24-2.79c-.48-.37-5.32-4.33-12.58-4.33s-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 4.21-5.24c-.76-.87-1.22-2-1.22-3.25 0-2.76 2.24-5 5-5z\"/><path d=\"M21 10c-1.93 0-3.5 1.57-3.5 3.5h1.75c0-.97.78-1.75 1.75-1.75s1.75.78 1.75 1.75c0 .48-.2.92-.51 1.24l-1.09 1.1c-.63.63-1.02 1.51-1.02 2.47v.44h1.75c0-1.31.39-1.84 1.03-2.47l.78-.8c.5-.5.82-1.2.82-1.97-.01-1.94-1.58-3.51-3.51-3.51zm-.95 11.95h1.9v-1.9h-1.9v1.9z\"/></g>\n<g id=\"signal-wifi-statusbar-null\"><path d=\"M13 4c4.25 0 7.62 1.51 9.68 2.75l-9.68 12.05-9.67-12.05c2.05-1.24 5.42-2.75 9.67-2.75m0-2c-7.26 0-12.1 3.96-12.58 4.32l12.57 15.66.01.02.01-.01 12.57-15.67c-.48-.36-5.32-4.32-12.58-4.32z\"/></g>\n<g id=\"storage\"><path d=\"M2 20h20v-4h-20v4zm2-3h2v2h-2v-2zm-2-13v4h20v-4h-20zm4 3h-2v-2h2v2zm-4 7h20v-4h-20v4zm2-3h2v2h-2v-2z\"/></g>\n<g id=\"tv-guide\"><path d=\"M19 3h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-3 13h-2l-2.25-6h-1.75v6h-2v-6h-3v-2h8.5l1.5 4.5 1.5-4.5h2.5l-3 8z\"/></g>\n<g id=\"tv-options-edit-channels\"><path d=\"M1 16h2v-2h-2v2zm17-10h-13v2h13v-2zm-17 6h2v-2h-2v2zm17-2h-13v2h13v-2zm4.59-.41l-7.59 7.58-3.59-3.59-1.41 1.42 5 5 9-9-1.41-1.41zm-21.59-1.59h2v-2h-2v2zm4 8h4v-2h-4v2z\"/></g>\n<g id=\"tv-options-input-settings\"><path d=\"M7.17 13.63l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.01.13.12.22.24.22h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.06-.83c.02-.16.04-.32.04-.49s-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.84-.49l-.19-1.32c-.03-.12-.14-.21-.26-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49s.01.33.04.49l-1.06.83c-.1.07-.12.21-.06.31zm4.83-3.63c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9-7h-18c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16.01h-18v-14.02h18v14.02z\"/></g>\n<g id=\"tv-options-parental\"><path d=\"M16.5 12c1.38 0 2.49-1.12 2.49-2.5s-1.11-2.5-2.49-2.5c-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5zm-7.5-1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75v2.25h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zm-7.5-1c-2.33 0-7 1.17-7 3.5v2.5h7v-2.25c0-.85.33-2.34 2.37-3.47-.87-.18-1.71-.28-2.37-.28z\"/></g>\n<g id=\"usb\"><path d=\"M15 7v4h1v2h-3v-8h2l-3-4-3 4h2v8h-3v-2.07c.7-.37 1.2-1.08 1.2-1.93 0-1.21-.99-2.2-2.2-2.2-1.21 0-2.2.99-2.2 2.2 0 .85.5 1.56 1.2 1.93v2.07c0 1.11.89 2 2 2h3v3.05c-.71.37-1.2 1.1-1.2 1.95 0 1.22.99 2.2 2.2 2.2 1.21 0 2.2-.98 2.2-2.2 0-.85-.49-1.58-1.2-1.95v-3.05h3c1.11 0 2-.89 2-2v-2h1v-4h-4z\"/></g>\n<g id=\"wifi-lock\"><path d=\"M20.5 9.5c.28 0 .55.04.81.08l2.69-3.58c-3.34-2.51-7.5-4-12-4s-8.66 1.49-12 4l12 16 3.5-4.67v-2.83c0-2.76 2.24-5 5-5zm2.5 6.5v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v1.5z\"/></g>\n<g id=\"wifi-tethering\"><path d=\"M12 11c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 2c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19zm-6-10c-5.52 0-10 4.48-10 10 0 3.7 2.01 6.92 4.99 8.65l1-1.73c-2.38-1.39-3.99-3.96-3.99-6.92 0-4.42 3.58-8 8-8s8 3.58 8 8c0 2.96-1.61 5.53-4 6.92l1 1.73c2.99-1.73 5-4.95 5-8.65 0-5.52-4.48-10-10-10z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/editor-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"editor\" iconSize=\"24\">\n<svg><defs>\n<g id=\"attach-file\"><path d=\"M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4v-12.5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1v-9.5h-1.5v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5v-10.5c0-2.21-1.79-4-4-4s-4 1.79-4 4v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5v-11.5h-1.5z\"/></g>\n<g id=\"attach-money\"><path d=\"M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81v-2.19h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83v2.17h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z\"/></g>\n<g id=\"border-all\"><path d=\"M3 3v18h18v-18h-18zm8 16h-6v-6h6v6zm0-8h-6v-6h6v6zm8 8h-6v-6h6v6zm0-8h-6v-6h6v6z\"/></g>\n<g id=\"border-bottom\"><path d=\"M9 11h-2v2h2v-2zm4 4h-2v2h2v-2zm-4-12h-2v2h2v-2zm4 8h-2v2h2v-2zm-8-8h-2v2h2v-2zm8 4h-2v2h2v-2zm4 4h-2v2h2v-2zm-4-8h-2v2h2v-2zm4 0h-2v2h2v-2zm2 10h2v-2h-2v2zm0 4h2v-2h-2v2zm-14-10h-2v2h2v-2zm14-4v2h2v-2h-2zm0 6h2v-2h-2v2zm-14 2h-2v2h2v-2zm-2 10h18v-2h-18v2zm2-6h-2v2h2v-2z\"/></g>\n<g id=\"border-clear\"><path d=\"M7 5h2v-2h-2v2zm0 8h2v-2h-2v2zm0 8h2v-2h-2v2zm4-4h2v-2h-2v2zm0 4h2v-2h-2v2zm-8 0h2v-2h-2v2zm0-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0-4h2v-2h-2v2zm0-4h2v-2h-2v2zm8 8h2v-2h-2v2zm8 4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8h2v-2h-2v2zm0-12h2v-2h-2v2zm-8 0h2v-2h-2v2zm8-6v2h2v-2h-2zm-8 2h2v-2h-2v2zm4 16h2v-2h-2v2zm0-8h2v-2h-2v2zm0-8h2v-2h-2v2z\"/></g>\n<g id=\"border-color\"><path d=\"M17.75 7l-3.75-3.75-10 10v3.75h3.75l10-10zm2.96-2.96c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.96 1.96 3.75 3.75 1.96-1.96z\"/><path fill-opacity=\".36\" d=\"M0 20h24v4h-24z\"/></g>\n<g id=\"border-horizontal\"><path d=\"M3 21h2v-2h-2v2zm2-14h-2v2h2v-2zm-2 10h2v-2h-2v2zm4 4h2v-2h-2v2zm-2-18h-2v2h2v-2zm4 0h-2v2h2v-2zm8 0h-2v2h2v-2zm-4 4h-2v2h2v-2zm0-4h-2v2h2v-2zm6 14h2v-2h-2v2zm-8 4h2v-2h-2v2zm-8-8h18v-2h-18v2zm16-10v2h2v-2h-2zm0 6h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 4h2v-2h-2v2zm4 0h2v-2h-2v2z\"/></g>\n<g id=\"border-inner\"><path d=\"M3 21h2v-2h-2v2zm4 0h2v-2h-2v2zm-2-14h-2v2h2v-2zm-2 10h2v-2h-2v2zm6-14h-2v2h2v-2zm-4 0h-2v2h2v-2zm12 0h-2v2h2v-2zm2 6h2v-2h-2v2zm0-6v2h2v-2h-2zm-4 18h2v-2h-2v2zm-2-18h-2v8h-8v2h8v8h2v-8h8v-2h-8v-8zm6 18h2v-2h-2v2zm0-4h2v-2h-2v2z\"/></g>\n<g id=\"border-left\"><path d=\"M11 21h2v-2h-2v2zm0-4h2v-2h-2v2zm0-12h2v-2h-2v2zm0 4h2v-2h-2v2zm0 4h2v-2h-2v2zm-4 8h2v-2h-2v2zm0-16h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 8h2v-18h-2v18zm16-12h2v-2h-2v2zm-4 12h2v-2h-2v2zm4-4h2v-2h-2v2zm0-14v2h2v-2h-2zm0 10h2v-2h-2v2zm0 8h2v-2h-2v2zm-4-8h2v-2h-2v2zm0-8h2v-2h-2v2z\"/></g>\n<g id=\"border-outer\"><path d=\"M13 7h-2v2h2v-2zm0 4h-2v2h2v-2zm4 0h-2v2h2v-2zm-14-8v18h18v-18h-18zm16 16h-14v-14h14v14zm-6-4h-2v2h2v-2zm-4-4h-2v2h2v-2z\"/></g>\n<g id=\"border-right\"><path d=\"M7 21h2v-2h-2v2zm-4-16h2v-2h-2v2zm4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm-4 8h2v-2h-2v2zm8 0h2v-2h-2v2zm-8-8h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm8 8h2v-2h-2v2zm4-4h2v-2h-2v2zm4-10v18h2v-18h-2zm-4 18h2v-2h-2v2zm0-16h2v-2h-2v2zm-4 8h2v-2h-2v2zm0-8h2v-2h-2v2zm0 4h2v-2h-2v2z\"/></g>\n<g id=\"border-style\"><path d=\"M15 21h2v-2h-2v2zm4 0h2v-2h-2v2zm-12 0h2v-2h-2v2zm4 0h2v-2h-2v2zm8-4h2v-2h-2v2zm0-4h2v-2h-2v2zm-16-10v18h2v-16h16v-2h-18zm16 6h2v-2h-2v2z\"/></g>\n<g id=\"border-top\"><path d=\"M7 21h2v-2h-2v2zm0-8h2v-2h-2v2zm4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm-8-4h2v-2h-2v2zm0 4h2v-2h-2v2zm0-8h2v-2h-2v2zm0-4h2v-2h-2v2zm8 8h2v-2h-2v2zm8-8h2v-2h-2v2zm0 4h2v-2h-2v2zm-16-10v2h18v-2h-18zm16 14h2v-2h-2v2zm-4 4h2v-2h-2v2zm-4-12h2v-2h-2v2zm8 12h2v-2h-2v2zm-4-8h2v-2h-2v2z\"/></g>\n<g id=\"border-vertical\"><path d=\"M3 9h2v-2h-2v2zm0-4h2v-2h-2v2zm4 16h2v-2h-2v2zm0-8h2v-2h-2v2zm-4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm0-4h2v-2h-2v2zm4-12h2v-2h-2v2zm12 12h2v-2h-2v2zm-8 4h2v-18h-2v18zm8 0h2v-2h-2v2zm0-8h2v-2h-2v2zm0-10v2h2v-2h-2zm0 6h2v-2h-2v2zm-4-4h2v-2h-2v2zm0 16h2v-2h-2v2zm0-8h2v-2h-2v2z\"/></g>\n<g id=\"format-align-center\"><path d=\"M7 15v2h10v-2h-10zm-4 6h18v-2h-18v2zm0-8h18v-2h-18v2zm4-6v2h10v-2h-10zm-4-4v2h18v-2h-18z\"/></g>\n<g id=\"format-align-justify\"><path d=\"M3 21h18v-2h-18v2zm0-4h18v-2h-18v2zm0-4h18v-2h-18v2zm0-4h18v-2h-18v2zm0-6v2h18v-2h-18z\"/></g>\n<g id=\"format-align-left\"><path d=\"M15 15h-12v2h12v-2zm0-8h-12v2h12v-2zm-12 6h18v-2h-18v2zm0 8h18v-2h-18v2zm0-18v2h18v-2h-18z\"/></g>\n<g id=\"format-align-right\"><path d=\"M3 21h18v-2h-18v2zm6-4h12v-2h-12v2zm-6-4h18v-2h-18v2zm6-4h12v-2h-12v2zm-6-6v2h18v-2h-18z\"/></g>\n<g id=\"format-bold\"><path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4h-6.25v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zm-5.6-4.29h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9h-3.5v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"format-clear\"><path d=\"M3.27 5l-1.27 1.27 6.97 6.97-2.47 5.76h3l1.57-3.66 5.66 5.66 1.27-1.27-14.45-14.46-.28-.27zm2.73 0v.18l2.82 2.82h2.4l-.72 1.68 2.1 2.1 1.61-3.78h5.79v-3h-14z\"/></g>\n<g id=\"format-color-fill\"><path d=\"M16.56 8.94l-8.94-8.94-1.41 1.41 2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zm-11.35 1.06l4.79-4.79 4.79 4.79h-9.58zm13.79 1.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5z\"/><path fill-opacity=\".36\" d=\"M0 20h24v4h-24z\"/></g>\n<g id=\"format-color-reset\"><path d=\"M18 14c0-4-6-10.8-6-10.8s-1.33 1.51-2.73 3.52l8.59 8.59c.09-.42.14-.86.14-1.31zm-.88 3.12l-4.62-4.62-7.23-7.23-1.27 1.28 3.32 3.32c-.77 1.45-1.32 2.92-1.32 4.13 0 3.31 2.69 6 6 6 1.52 0 2.9-.57 3.96-1.5l2.63 2.63 1.27-1.27-2.74-2.74z\"/></g>\n<g id=\"format-color-text\"><path fill-opacity=\".36\" d=\"M0 20h24v4h-24z\"/><path d=\"M11 3l-5.5 14h2.25l1.12-3h6.25l1.12 3h2.25l-5.49-14h-2zm-1.38 9l2.38-6.33 2.38 6.33h-4.76z\"/></g>\n<g id=\"format-indent-decrease\"><path d=\"M11 17h10v-2h-10v2zm-8-5l4 4v-8l-4 4zm0 9h18v-2h-18v2zm0-18v2h18v-2h-18zm8 6h10v-2h-10v2zm0 4h10v-2h-10v2z\"/></g>\n<g id=\"format-indent-increase\"><path d=\"M3 21h18v-2h-18v2zm0-13v8l4-4-4-4zm8 9h10v-2h-10v2zm-8-14v2h18v-2h-18zm8 6h10v-2h-10v2zm0 4h10v-2h-10v2z\"/></g>\n<g id=\"format-italic\"><path d=\"M10 4v3h2.21l-3.42 8h-2.79v3h8v-3h-2.21l3.42-8h2.79v-3z\"/></g>\n<g id=\"format-line-spacing\"><path d=\"M6 7h2.5l-3.5-3.5-3.5 3.5h2.5v10h-2.5l3.5 3.5 3.5-3.5h-2.5v-10zm4-2v2h12v-2h-12zm0 14h12v-2h-12v2zm0-6h12v-2h-12v2z\"/></g>\n<g id=\"format-list-bulleted\"><path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0 12.17c-.74 0-1.33.6-1.33 1.33s.6 1.33 1.33 1.33 1.33-.6 1.33-1.33-.59-1.33-1.33-1.33zm3 2.33h14v-2h-14v2zm0-6h14v-2h-14v2zm0-8v2h14v-2h-14z\"/></g>\n<g id=\"format-list-numbered\"><path d=\"M2 17h2v.5h-1v1h1v.5h-2v1h3v-4h-3v1zm1-9h1v-4h-2v1h1v3zm-1 3h1.8l-1.8 2.1v.9h3v-1h-1.8l1.8-2.1v-.9h-3v1zm5-6v2h14v-2h-14zm0 14h14v-2h-14v2zm0-6h14v-2h-14v2z\"/></g>\n<g id=\"format-paint\"><path d=\"M18 4v-1c0-.55-.45-1-1-1h-12c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-1h1v4h-10v11c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-9h8v-8h-3z\"/></g>\n<g id=\"format-quote\"><path d=\"M6 17h3l2-4v-6h-6v6h3zm8 0h3l2-4v-6h-6v6h3z\"/></g>\n<g id=\"format-size\"><path d=\"M9 4v3h5v12h3v-12h5v-3h-13zm-6 8h3v7h3v-7h3v-3h-9v3z\"/></g>\n<g id=\"format-strikethrough\"><path d=\"M10 19h4v-3h-4v3zm-5-15v3h5v3h4v-3h5v-3h-14zm-2 10h18v-2h-18v2z\"/></g>\n<g id=\"format-textdirection-l-to-r\"><path d=\"M18 4h-12v2l6.5 6-6.5 6v2h12v-3h-7l5-5-5-5h7z\"/></g>\n<g id=\"format-textdirection-r-to-l\"><path d=\"M9 10v5h2v-11h2v11h2v-11h2v-2h-8c-2.21 0-4 1.79-4 4s1.79 4 4 4zm12 8l-4-4v3h-12v2h12v3l4-4z\"/></g>\n<g id=\"format-underline\"><path d=\"M12 17c3.31 0 6-2.69 6-6v-8h-2.5v8c0 1.93-1.57 3.5-3.5 3.5s-3.5-1.57-3.5-3.5v-8h-2.5v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2h-14z\"/></g>\n<g id=\"functions\"><path d=\"M10 10v5h2v-11h2v11h2v-11h2v-2h-8c-2.21 0-4 1.79-4 4s1.79 4 4 4zm-2 7v-3l-4 4 4 4v-3h12v-2h-12z\"/></g>\n<g id=\"insert-chart\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g>\n<g id=\"insert-comment\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4v-18c0-1.1-.9-2-2-2zm-2 12h-12v-2h12v2zm0-3h-12v-2h12v2zm0-3h-12v-2h12v2z\"/></g>\n<g id=\"insert-drive-file\"><path d=\"M6 2c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.89 2 1.99 2h12.01c1.1 0 2-.9 2-2v-12l-6-6h-8zm7 7v-5.5l5.5 5.5h-5.5z\"/></g>\n<g id=\"insert-emoticon\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5h-10.22c.8 2.04 2.78 3.5 5.11 3.5z\"/></g>\n<g id=\"insert-invitation\"><path d=\"M17 12h-5v5h5v-5zm-1-11v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2h-1v-2h-2zm3 18h-14v-11h14v11z\"/></g>\n<g id=\"insert-link\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4v-1.9h-4c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9h-4c-1.71 0-3.1-1.39-3.1-3.1zm4.1 1h8v-2h-8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4v1.9h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></g>\n<g id=\"insert-photo\"><path d=\"M21 19v-14c0-1.1-.9-2-2-2h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zm-12.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"merge-type\"><path d=\"M17 20.41l1.41-1.41-3.41-3.41-1.41 1.41 3.41 3.41zm-9.5-12.41h3.5v5.59l-5.41 5.41 1.41 1.41 6-6v-6.41h3.5l-4.5-4.5-4.5 4.5z\"/></g>\n<g id=\"mode-comment\"><path d=\"M21.99 4c0-1.1-.89-2-1.99-2h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z\"/></g>\n<g id=\"mode-edit\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g>\n<g id=\"publish\"><path d=\"M5 4v2h14v-2h-14zm0 10h4v6h6v-6h4l-7-7-7 7z\"/></g>\n<g id=\"vertical-align-bottom\"><path d=\"M16 13h-3v-10h-2v10h-3l4 4 4-4zm-12 6v2h16v-2h-16z\"/></g>\n<g id=\"vertical-align-center\"><path d=\"M8 19h3v4h2v-4h3l-4-4-4 4zm8-14h-3v-4h-2v4h-3l4 4 4-4zm-12 6v2h16v-2h-16z\"/></g>\n<g id=\"vertical-align-top\"><path d=\"M8 11h3v10h2v-10h3l-4-4-4 4zm-4-8v2h16v-2h-16z\"/></g>\n<g id=\"wrap-text\"><path d=\"M4 19h6v-2h-6v2zm16-14h-16v2h16v-2zm-3 6h-13v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2h-2.25v-2l-3 3 3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/hardware-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"hardware\" iconSize=\"24\">\n<svg><defs>\n<g id=\"cast\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v3h2v-3h18v14h-7v2h7c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-20 15v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11z\"/></g>\n<g id=\"cast-connected\"><path d=\"M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm18-7h-14v1.63c3.96 1.28 7.09 4.41 8.37 8.37h5.63v-10zm-18 3v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7h-18c-1.1 0-2 .9-2 2v3h2v-3h18v14h-7v2h7c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"chromecast\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 2c2.96 0 5.54 1.61 6.92 4h-6.92c-1.94 0-3.55 1.38-3.92 3.21l-2.38-4.13c1.46-1.87 3.74-3.08 6.3-3.08zm3 8c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-11 0c0-1.46.4-2.82 1.08-3.99l3.46 6 .01-.01c.69 1.19 1.97 2 3.45 2 .45 0 .88-.09 1.29-.23l-2.39 4.15c-3.9-.54-6.9-3.88-6.9-7.92zm8 8l3.46-6-.02-.01c.35-.59.56-1.26.56-1.99 0-1.2-.54-2.27-1.38-3h4.79c.38.93.59 1.94.59 3 0 4.42-3.58 8-8 8z\"/></g>\n<g id=\"computer\"><path d=\"M20 18c1.1 0 1.99-.9 1.99-2l.01-10c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h-4v2h24v-2h-4zm-16-12h16v10h-16v-10z\"/></g>\n<g id=\"desktop-mac\"><path d=\"M21 2h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7l-2 3v1h8v-1l-2-3h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 12h-18v-10h18v10z\"/></g>\n<g id=\"desktop-windows\"><path d=\"M21 2h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v2h-2v2h8v-2h-2v-2h7c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-18v-12h18v12z\"/></g>\n<g id=\"dock\"><path d=\"M8 23h8v-2h-8v2zm8-21.99l-8-.01c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2v-14c0-1.1-.9-1.99-2-1.99zm0 13.99h-8v-10h8v10z\"/></g>\n<g id=\"gamepad\"><path d=\"M15 7.5v-5.5h-6v5.5l3 3 3-3zm-7.5 1.5h-5.5v6h5.5l3-3-3-3zm1.5 7.5v5.5h6v-5.5l-3-3-3 3zm7.5-7.5l-3 3 3 3h5.5v-6h-5.5z\"/></g>\n<g id=\"headset\"><path d=\"M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8h-4v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h3c1.66 0 3-1.34 3-3v-7c0-4.97-4.03-9-9-9z\"/></g>\n<g id=\"headset-mic\"><path d=\"M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8h-4v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h4v1h-7v2h6c1.66 0 3-1.34 3-3v-10c0-4.97-4.03-9-9-9z\"/></g>\n<g id=\"keyboard\"><path d=\"M20 5h-16c-1.1 0-1.99.9-1.99 2l-.01 10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-9 3h2v2h-2v-2zm0 3h2v2h-2v-2zm-3-3h2v2h-2v-2zm0 3h2v2h-2v-2zm-1 2h-2v-2h2v2zm0-3h-2v-2h2v2zm9 7h-8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2v-2h2v2zm3 3h-2v-2h2v2zm0-3h-2v-2h2v2z\"/></g>\n<g id=\"keyboard-alt\"><path d=\"M15.5 10c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 7c2.61 0 4.83-1.67 5.65-4h-11.3c.82 2.33 3.04 4 5.65 4zm-.01-16c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"keyboard-arrow-down\"><path d=\"M7.41 7.84l4.59 4.58 4.59-4.58 1.41 1.41-6 6-6-6z\"/></g>\n<g id=\"keyboard-arrow-left\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59-1.41-1.41-6 6 6 6z\"/></g>\n<g id=\"keyboard-arrow-right\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59 1.41-1.41 6 6-6 6z\"/></g>\n<g id=\"keyboard-arrow-up\"><path d=\"M7.41 15.41l4.59-4.58 4.59 4.58 1.41-1.41-6-6-6 6z\"/></g>\n<g id=\"keyboard-backspace\"><path d=\"M21 11h-14.17l3.58-3.59-1.41-1.41-6 6 6 6 1.41-1.41-3.58-3.59h14.17z\"/></g>\n<g id=\"keyboard-capslock\"><path d=\"M12 8.41l4.59 4.59 1.41-1.41-6-6-6 6 1.41 1.41 4.59-4.59zm-6 9.59h12v-2h-12v2z\"/></g>\n<g id=\"keyboard-control\"><path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"keyboard-hide\"><path d=\"M20 3h-16c-1.1 0-1.99.9-1.99 2l-.01 10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-9 3h2v2h-2v-2zm0 3h2v2h-2v-2zm-3-3h2v2h-2v-2zm0 3h2v2h-2v-2zm-1 2h-2v-2h2v2zm0-3h-2v-2h2v2zm9 7h-8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2v-2h2v2zm3 3h-2v-2h2v2zm0-3h-2v-2h2v2zm-7 15l4-4h-8l4 4z\"/></g>\n<g id=\"keyboard-return\"><path d=\"M19 7v4h-13.17l3.58-3.59-1.41-1.41-6 6 6 6 1.41-1.41-3.58-3.59h15.17v-6z\"/></g>\n<g id=\"keyboard-tab\"><path d=\"M11.59 7.41l3.58 3.59h-14.17v2h14.17l-3.59 3.59 1.42 1.41 6-6-6-6-1.41 1.41zm8.41-1.41v12h2v-12h-2z\"/></g>\n<g id=\"keyboard-voice\"><path d=\"M12 15c1.66 0 2.99-1.34 2.99-3l.01-6c0-1.66-1.34-3-3-3s-3 1.34-3 3v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1s-5.3-2.1-5.3-5.1h-1.7c0 3.42 2.72 6.23 6 6.72v3.28h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"/></g>\n<g id=\"laptop\"><path d=\"M20 18c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h-4v2h24v-2h-4zm-16-12h16v10h-16v-10z\"/></g>\n<g id=\"laptop-chromebook\"><path d=\"M22 18v-15h-20v15h-2v2h24v-2h-2zm-8 0h-4v-1h4v1zm6-3h-16v-10h16v10z\"/></g>\n<g id=\"laptop-mac\"><path d=\"M20 18c1.1 0 1.99-.9 1.99-2l.01-11c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2h-4c0 1.1.9 2 2 2h20c1.1 0 2-.9 2-2h-4zm-16-13h16v11h-16v-11zm8 14c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"laptop-windows\"><path d=\"M20 18v-1c1.1 0 1.99-.9 1.99-2l.01-10c0-1.1-.9-2-2-2h-16c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2v1h-4v2h24v-2h-4zm-16-13h16v10h-16v-10z\"/></g>\n<g id=\"memory\"><path d=\"M15 9h-6v6h6v-6zm-2 4h-2v-2h2v2zm8-2v-2h-2v-2c0-1.1-.9-2-2-2h-2v-2h-2v2h-2v-2h-2v2h-2c-1.1 0-2 .9-2 2v2h-2v2h2v2h-2v2h2v2c0 1.1.9 2 2 2h2v2h2v-2h2v2h2v-2h2c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2zm-4 6h-10v-10h10v10z\"/></g>\n<g id=\"mouse\"><path d=\"M13 1.07v7.93h7c0-4.08-3.05-7.44-7-7.93zm-9 13.93c0 4.42 3.58 8 8 8s8-3.58 8-8v-4h-16v4zm7-13.93c-3.95.49-7 3.85-7 7.93h7v-7.93z\"/></g>\n<g id=\"phone-android\"><path d=\"M16 1h-8c-1.66 0-3 1.34-3 3v16c0 1.66 1.34 3 3 3h8c1.66 0 3-1.34 3-3v-16c0-1.66-1.34-3-3-3zm-2 20h-4v-1h4v1zm3.25-3h-10.5v-14h10.5v14z\"/></g>\n<g id=\"phone-iphone\"><path d=\"M15.5 1h-8c-1.38 0-2.5 1.12-2.5 2.5v17c0 1.38 1.12 2.5 2.5 2.5h8c1.38 0 2.5-1.12 2.5-2.5v-17c0-1.38-1.12-2.5-2.5-2.5zm-4 21c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5-4h-9v-14h9v14z\"/></g>\n<g id=\"phonelink\"><path d=\"M4 6h18v-2h-18c-1.1 0-2 .9-2 2v11h-2v3h14v-3h-10v-11zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-10c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z\"/></g>\n<g id=\"phonelink-off\"><path d=\"M22 6v-2h-15.18l2 2h13.18zm-20.08-4.35l-1.27 1.27 1.82 1.82c-.29.34-.47.78-.47 1.26v11h-2v3h17.73l2.35 2.35 1.27-1.27-17.46-17.46-1.97-1.97zm2.08 4.62l10.73 10.73h-10.73v-10.73zm19 1.73h-6c-.55 0-1 .45-1 1v4.18l2 2v-5.18h4v7h-2.18l3 3h.18c.55 0 1-.45 1-1v-10c0-.55-.45-1-1-1z\"/></g>\n<g id=\"security\"><path d=\"M12 1l-9 4v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12v-6l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94v-8.93h-7v-5.7l7-3.11v8.8z\"/></g>\n<g id=\"sim-card\"><path d=\"M19.99 4c0-1.1-.89-2-1.99-2h-8l-6 6v12c0 1.1.9 2 2 2h12.01c1.1 0 1.99-.9 1.99-2l-.01-16zm-10.99 15h-2v-2h2v2zm8 0h-2v-2h2v2zm-8-4h-2v-4h2v4zm4 4h-2v-4h2v4zm0-6h-2v-2h2v2zm4 2h-2v-4h2v4z\"/></g>\n<g id=\"smartphone\"><path d=\"M17 1.01l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14z\"/></g>\n<g id=\"speaker\"><path d=\"M17 2h-10c-1.1 0-2 .9-2 2v16c0 1.1.9 1.99 2 1.99l10 .01c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-5 2c1.1 0 2 .9 2 2s-.9 2-2 2c-1.11 0-2-.9-2-2s.89-2 2-2zm0 16c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"tablet\"><path d=\"M21 4h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 1.99-.9 1.99-2l.01-12c0-1.1-.9-2-2-2zm-2 14h-14v-12h14v12z\"/></g>\n<g id=\"tablet-android\"><path d=\"M18 0h-12c-1.66 0-3 1.34-3 3v18c0 1.66 1.34 3 3 3h12c1.66 0 3-1.34 3-3v-18c0-1.66-1.34-3-3-3zm-4 22h-4v-1h4v1zm5.25-3h-14.5v-16h14.5v16z\"/></g>\n<g id=\"tablet-mac\"><path d=\"M18.5 0h-14c-1.38 0-2.5 1.12-2.5 2.5v19c0 1.38 1.12 2.5 2.5 2.5h14c1.38 0 2.5-1.12 2.5-2.5v-19c0-1.38-1.12-2.5-2.5-2.5zm-7 23c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7.5-4h-15v-16h15v16z\"/></g>\n<g id=\"tv\"><path d=\"M21 3h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2l.01-12c0-1.1-.9-2-2-2zm0 14h-18v-12h18v12z\"/></g>\n<g id=\"watch\"><path d=\"M20 12c0-2.54-1.19-4.81-3.04-6.27l-.96-5.73h-8l-.95 5.73c-1.86 1.46-3.05 3.72-3.05 6.27s1.19 4.81 3.05 6.27l.95 5.73h8l.96-5.73c1.85-1.46 3.04-3.73 3.04-6.27zm-14 0c0-3.31 2.69-6 6-6s6 2.69 6 6-2.69 6-6 6-6-2.69-6-6z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/image-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"image\" iconSize=\"24\">\n<svg><defs>\n<g id=\"add-to-photos\"><path d=\"M4 6h-2v14c0 1.1.9 2 2 2h14v-2h-14v-14zm16-4h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z\"/></g>\n<g id=\"adjust\"><path d=\"M12 2c-5.51 0-10 4.49-10 10s4.49 10 10 10 10-4.49 10-10-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3-8c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3z\"/></g>\n<g id=\"assistant-photo\"><path d=\"M14.4 6l-.4-2h-9v17h2v-7h5.6l.4 2h7v-10z\"/></g>\n<g id=\"audiotrack\"><path d=\"M12 3v9.28c-.47-.17-.97-.28-1.5-.28-2.49 0-4.5 2.01-4.5 4.5s2.01 4.5 4.5 4.5c2.31 0 4.2-1.75 4.45-4h.05v-11h4v-3h-7z\"/></g>\n<g id=\"blur-circular\"><path d=\"M10 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-3-3c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3-6c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm4 1.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-1.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm3 6c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-4c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-5-7.5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm2-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z\"/></g>\n<g id=\"blur-linear\"><path d=\"M5 17.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm4-4.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-6 12h18v-2h-18v2zm2-11.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm0 4c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm4 3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8-.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-14-13.5v2h18v-2h-18zm14 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm0 4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-4-3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1z\"/></g>\n<g id=\"blur-off\"><path d=\"M14 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-.2 4.48l.2.02c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5l.02.2c.09.67.61 1.19 1.28 1.28zm.2-7.98c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-4 0c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm11 7c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-11-3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8 8c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-4 13.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-11.5-15.23l3.78 3.78-.28-.05c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l2.81 2.81c-.71.11-1.25.73-1.25 1.47 0 .83.67 1.5 1.5 1.5.74 0 1.36-.54 1.47-1.25l2.81 2.81c-.09-.03-.18-.06-.28-.06-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l3.78 3.78 1.28-1.27-16.23-16.23-1.27 1.27zm7.5 11.73c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm11-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-15-.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 11c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-4-3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z\"/></g>\n<g id=\"blur-on\"><path d=\"M6 13c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3 .5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3-4.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm15 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-7-3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-3.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-11 10c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-17c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm0 3.5c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 5.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm8 .5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm3 8.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-7 3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-4-12c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0 8.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm4-4.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-4c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"/></g>\n<g id=\"brightness-1\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></g>\n<g id=\"brightness-2\"><path d=\"M10 2c-1.82 0-3.53.5-5 1.35 2.99 1.73 5 4.95 5 8.65s-2.01 6.92-5 8.65c1.47.85 3.18 1.35 5 1.35 5.52 0 10-4.48 10-10s-4.48-10-10-10z\"/></g>\n<g id=\"brightness-3\"><path d=\"M9 2c-1.05 0-2.05.16-3 .46 4.06 1.27 7 5.06 7 9.54 0 4.48-2.94 8.27-7 9.54.95.3 1.95.46 3 .46 5.52 0 10-4.48 10-10s-4.48-10-10-10z\"/></g>\n<g id=\"brightness-4\"><path d=\"M20 8.69v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-8 9.31c-.89 0-1.74-.2-2.5-.55 2.06-.95 3.5-3.03 3.5-5.45s-1.44-4.5-3.5-5.45c.76-.35 1.61-.55 2.5-.55 3.31 0 6 2.69 6 6s-2.69 6-6 6z\"/></g>\n<g id=\"brightness-5\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z\"/></g>\n<g id=\"brightness-6\"><path d=\"M20 15.31l3.31-3.31-3.31-3.31v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69zm-8 2.69v-12c3.31 0 6 2.69 6 6s-2.69 6-6 6z\"/></g>\n<g id=\"brightness-7\"><path d=\"M20 8.69v-4.69h-4.69l-3.31-3.31-3.31 3.31h-4.69v4.69l-3.31 3.31 3.31 3.31v4.69h4.69l3.31 3.31 3.31-3.31h4.69v-4.69l3.31-3.31-3.31-3.31zm-8 9.31c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z\"/></g>\n<g id=\"brush\"><path d=\"M7 14c-1.66 0-3 1.34-3 3 0 1.31-1.16 2-2 2 .92 1.22 2.49 2 4 2 2.21 0 4-1.79 4-4 0-1.66-1.34-3-3-3zm13.71-9.37l-1.34-1.34c-.39-.39-1.02-.39-1.41 0l-8.96 8.96 2.75 2.75 8.96-8.96c.39-.39.39-1.02 0-1.41z\"/></g>\n<g id=\"camera\"><path d=\"M9.4 10.5l4.77-8.26c-.7-.15-1.42-.24-2.17-.24-2.4 0-4.6.85-6.32 2.25l3.66 6.35.06-.1zm12.14-1.5c-.92-2.92-3.15-5.26-6-6.34l-3.66 6.34h9.66zm.26 1h-7.49l.29.5 4.76 8.25c1.64-1.78 2.64-4.14 2.64-6.75 0-.69-.07-1.35-.2-2zm-13.26 2l-3.9-6.75c-1.63 1.78-2.64 4.14-2.64 6.75 0 .69.07 1.35.2 2h7.49l-1.15-2zm-6.08 3c.92 2.92 3.15 5.26 6 6.34l3.66-6.34h-9.66zm11.27 0l-3.9 6.76c.7.15 1.42.24 2.17.24 2.4 0 4.6-.85 6.32-2.25l-3.66-6.35-.93 1.6z\"/></g>\n<g id=\"camera-alt\"><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2h-3.17l-1.83-2h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></g>\n<g id=\"camera-front\"><path d=\"M10 20h-5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zm-2-12c1.1 0 2-.9 2-2s-.9-2-2-2-1.99.9-1.99 2 .89 2 1.99 2zm5-8h-10c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 2h10v10.5c0-1.67-3.33-2.5-5-2.5s-5 .83-5 2.5v-10.5z\"/></g>\n<g id=\"camera-rear\"><path d=\"M10 20h-5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zm3-20h-10c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-5 6c-1.11 0-2-.9-2-2s.89-2 1.99-2 2 .9 2 2c.01 1.1-.89 2-1.99 2z\"/></g>\n<g id=\"camera-roll\"><path d=\"M14 5c0-1.1-.9-2-2-2h-1v-1c0-.55-.45-1-1-1h-4c-.55 0-1 .45-1 1v1h-1c-1.1 0-2 .9-2 2v15c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2h8v-15h-8zm-2 13h-2v-2h2v2zm0-9h-2v-2h2v2zm4 9h-2v-2h2v2zm0-9h-2v-2h2v2zm4 9h-2v-2h2v2zm0-9h-2v-2h2v2z\"/></g>\n<g id=\"center-focus-strong\"><path d=\"M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-7 7h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm0-10h4v-2h-4c-1.1 0-2 .9-2 2v4h2v-4zm14-2h-4v2h4v4h2v-4c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4z\"/></g>\n<g id=\"center-focus-weak\"><path d=\"M5 15h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm0-10h4v-2h-4c-1.1 0-2 .9-2 2v4h2v-4zm14-2h-4v2h4v4h2v-4c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm-7-11c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"collections\"><path d=\"M22 16v-12c0-1.1-.9-2-2-2h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71 2.97-3.71 4 5h-12l3-4zm-9-6v14c0 1.1.9 2 2 2h14v-2h-14v-14h-2z\"/></g>\n<g id=\"colorize\"><path d=\"M20.71 5.63l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-3.12 3.12-1.93-1.91-1.41 1.41 1.42 1.42-8.92 8.92v4.75h4.75l8.92-8.92 1.42 1.42 1.41-1.41-1.92-1.92 3.12-3.12c.4-.4.4-1.03.01-1.42zm-13.79 13.37l-1.92-1.92 8.06-8.06 1.92 1.92-8.06 8.06z\"/></g>\n<g id=\"color-lens\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5h1.77c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3-4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"compare\"><path d=\"M10 3h-5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h5v2h2v-22h-2v2zm0 15h-5l5-6v6zm9-15h-5v2h5v13l-5-6v9h5c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"control-point\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.51 0-10 4.49-10 10s4.49 10 10 10 10-4.49 10-10-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"control-point-duplicate\"><path d=\"M16 8h-2v3h-3v2h3v3h2v-3h3v-2h-3zm-14 4c0-2.79 1.64-5.2 4.01-6.32v-2.16c-3.49 1.24-6.01 4.57-6.01 8.48s2.52 7.24 6.01 8.48v-2.16c-2.37-1.12-4.01-3.53-4.01-6.32zm13-9c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9zm0 16c-3.86 0-7-3.14-7-7s3.14-7 7-7 7 3.14 7 7-3.14 7-7 7z\"/></g>\n<g id=\"crop-16-9\"><path d=\"M19 6h-14c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-8c0-1.1-.9-2-2-2zm0 10h-14v-8h14v8z\"/></g>\n<g id=\"crop\"><path d=\"M17 15h2v-8c0-1.1-.9-2-2-2h-8v2h8v8zm-10 2v-16h-2v4h-4v2h4v10c0 1.1.9 2 2 2h10v4h2v-4h4v-2h-16z\"/></g>\n<g id=\"crop-3-2\"><path d=\"M19 4h-14c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-14v-12h14v12z\"/></g>\n<g id=\"crop-5-4\"><path d=\"M19 5h-14c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-14v-10h14v10z\"/></g>\n<g id=\"crop-7-5\"><path d=\"M19 7h-14c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-6c0-1.1-.9-2-2-2zm0 8h-14v-6h14v6z\"/></g>\n<g id=\"crop-din\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"crop-free\"><path d=\"M3 5v4h2v-4h4v-2h-4c-1.1 0-2 .9-2 2zm2 10h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm14 4h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm0-16h-4v2h4v4h2v-4c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"crop-landscape\"><path d=\"M19 5h-14c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm0 12h-14v-10h14v10z\"/></g>\n<g id=\"crop-original\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-5.04-6.71l-2.75 3.54-1.96-2.36-2.75 3.53h11l-3.54-4.71z\"/></g>\n<g id=\"crop-portrait\"><path d=\"M17 3h-10c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-10v-14h10v14z\"/></g>\n<g id=\"crop-square\"><path d=\"M18 4h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-12v-12h12v12z\"/></g>\n<g id=\"dehaze\"><path d=\"M2 15.5v2h20v-2h-20zm0-5v2h20v-2h-20zm0-5v2h20v-2h-20z\"/></g>\n<g id=\"details\"><path d=\"M3 4l9 16 9-16h-18zm3.38 2h11.25l-5.63 10-5.62-10z\"/></g>\n<g id=\"edit\"><path d=\"M3 17.25v3.75h3.75l11.06-11.06-3.75-3.75-11.06 11.06zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"/></g>\n<g id=\"exposure\"><path d=\"M15 17v2h2v-2h2v-2h-2v-2h-2v2h-2v2h2zm5-15h-16c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-15 3h6v2h-6v-2zm15 15h-16l16-16v16z\"/></g>\n<g id=\"exposure-minus-1\"><path d=\"M4 11v2h8v-2h-8zm15 7h-2v-10.62l-3 1.02v-1.7l4.7-1.7h.3v13z\"/></g>\n<g id=\"exposure-minus-2\"><path d=\"M15.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17s.19-.79.19-1.18c0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55v1.49h8.63v-1.71h-5.95zm-13.05-5.29v2h8v-2h-8z\"/></g>\n<g id=\"exposure-plus-1\"><path d=\"M10 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm10 11h-2v-10.62l-3 1.02v-1.7l4.7-1.7h.3v13z\"/></g>\n<g id=\"exposure-plus-2\"><path d=\"M16.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17.13-.39.19-.79.19-1.18 0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55v1.49h8.63v-1.71h-5.95zm-8.05-9.29h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4z\"/></g>\n<g id=\"exposure-zero\"><path d=\"M16.14 12.5c0 1-.1 1.85-.3 2.55-.2.7-.48 1.27-.83 1.7-.36.44-.79.75-1.3.95-.51.2-1.07.3-1.7.3-.62 0-1.18-.1-1.69-.3-.51-.2-.95-.51-1.31-.95-.36-.44-.65-1.01-.85-1.7-.2-.7-.3-1.55-.3-2.55v-2.04c0-1 .1-1.85.3-2.55.2-.7.48-1.26.84-1.69.36-.43.8-.74 1.31-.93.5-.19 1.07-.29 1.69-.29.63 0 1.19.1 1.7.29.51.19.95.5 1.31.93.36.43.64.99.84 1.69.2.7.3 1.54.3 2.55v2.04zm-2.11-2.36c0-.64-.05-1.18-.13-1.62-.09-.44-.22-.79-.4-1.06-.17-.27-.39-.46-.64-.58-.25-.13-.54-.19-.86-.19-.32 0-.61.06-.86.18s-.47.31-.64.58c-.17.27-.31.62-.4 1.06s-.13.98-.13 1.62v2.67c0 .64.05 1.18.14 1.62.09.45.23.81.4 1.09s.39.48.64.61.54.19.87.19c.33 0 .62-.06.87-.19s.46-.33.63-.61c.17-.28.3-.64.39-1.09.09-.45.13-.99.13-1.62v-2.66z\"/></g>\n<g id=\"filter-1\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm11 10h2v-10h-4v2h2v8zm7-14h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-2\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-4-4h-4v-2h2c1.1 0 2-.89 2-2v-2c0-1.11-.9-2-2-2h-4v2h4v2h-2c-1.1 0-2 .89-2 2v4h6v-2z\"/></g>\n<g id=\"filter\"><path d=\"M15.96 10.29l-2.75 3.54-1.96-2.36-2.75 3.53h11l-3.54-4.71zm-12.96-5.29h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-3\"><path d=\"M21 1h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-18-12h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm14 8v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5v-1.5c0-1.11-.9-2-2-2h-4v2h4v2h-2v2h2v2h-4v2h4c1.1 0 2-.89 2-2z\"/></g>\n<g id=\"filter-4\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm12 10h2v-10h-2v4h-2v-4h-2v6h4v4zm6-14h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-5\"><path d=\"M21 1h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-18-12h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm14 8v-2c0-1.11-.9-2-2-2h-2v-2h4v-2h-6v6h4v2h-4v2h4c1.1 0 2-.89 2-2z\"/></g>\n<g id=\"filter-6\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-8-2h2c1.1 0 2-.89 2-2v-2c0-1.11-.9-2-2-2h-2v-2h4v-2h-4c-1.1 0-2 .89-2 2v6c0 1.11.9 2 2 2zm0-4h2v2h-2v-2z\"/></g>\n<g id=\"filter-7\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-8-2l4-8v-2h-6v2h4l-4 8h2z\"/></g>\n<g id=\"filter-8\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-8-2h2c1.1 0 2-.89 2-2v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5v-1.5c0-1.11-.9-2-2-2h-2c-1.1 0-2 .89-2 2v1.5c0 .83.67 1.5 1.5 1.5-.83 0-1.5.67-1.5 1.5v1.5c0 1.11.9 2 2 2zm0-8h2v2h-2v-2zm0 4h2v2h-2v-2z\"/></g>\n<g id=\"filter-9\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14zm-6-12h-2c-1.1 0-2 .89-2 2v2c0 1.11.9 2 2 2h2v2h-4v2h4c1.1 0 2-.89 2-2v-6c0-1.11-.9-2-2-2zm0 4h-2v-2h2v2z\"/></g>\n<g id=\"filter-9-plus\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm11 7v-4c0-1.11-.9-2-2-2h-1c-1.1 0-2 .89-2 2v1c0 1.11.9 2 2 2h1v1h-3v2h3c1.1 0 2-.89 2-2zm-3-3v-1h1v1h-1zm10-8h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 8h-2v-2h-2v2h-2v2h2v2h2v-2h2v6h-14v-14h14v6z\"/></g>\n<g id=\"filter-b-and-w\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16l-7-8v8h-7l7-8v-6h7v14z\"/></g>\n<g id=\"filter-center-focus\"><path d=\"M5 15h-2v4c0 1.1.9 2 2 2h4v-2h-4v-4zm0-10h4v-2h-4c-1.1 0-2 .9-2 2v4h2v-4zm14-2h-4v2h4v4h2v-4c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm-7-10c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"filter-drama\"><path d=\"M19.35 10.04c-.68-3.45-3.71-6.04-7.35-6.04-2.89 0-5.39 1.64-6.64 4.04-3.01.32-5.36 2.86-5.36 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zm-.35 7.96h-13c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4h2c0-2.76-1.86-5.08-4.4-5.78 1.01-1.34 2.6-2.22 4.4-2.22 3.03 0 5.5 2.47 5.5 5.5v.5h1.5c1.65 0 3 1.35 3 3s-1.35 3-3 3z\"/></g>\n<g id=\"filter-frames\"><path d=\"M20 4h-4l-4-4-4 4h-4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-16v-14h4.52l3.52-3.5 3.48 3.5h4.48v14zm-2-12h-12v10h12\"/></g>\n<g id=\"filter-hdr\"><path d=\"M14 6l-3.75 5 2.85 3.8-1.6 1.2c-1.69-2.25-4.5-6-4.5-6l-6 8h22l-9-12z\"/></g>\n<g id=\"filter-none\"><path d=\"M3 5h-2v16c0 1.1.9 2 2 2h16v-2h-16v-16zm18-4h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"filter-retrolux\"><path d=\"M13 16.43l6-9.43-7-7-7 7 6 9.43v.11c-.6-.35-1.29-.54-2-.54-2.21 0-4 1.79-4 4s1.79 4 4 4c1.85 0 3.41-1.26 3.86-2.96l2.97 2.96 1.42-1.41-4.25-4.25v-1.91zm-2 3.57c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.53 0 1.04.21 1.41.58l.59.59v.83z\"/></g>\n<g id=\"filter-tilt-shift\"><path d=\"M11 4.07v-2.02c-2.01.2-3.84 1-5.32 2.21l1.42 1.43c1.11-.86 2.44-1.44 3.9-1.62zm7.32.19c-1.48-1.21-3.31-2.01-5.32-2.21v2.02c1.46.18 2.79.76 3.9 1.62l1.42-1.43zm1.61 6.74h2.02c-.2-2.01-1-3.84-2.21-5.32l-1.43 1.42c.86 1.11 1.44 2.44 1.62 3.9zm-14.24-3.9l-1.43-1.42c-1.21 1.48-2.01 3.31-2.21 5.32h2.02c.18-1.46.76-2.79 1.62-3.9zm-1.62 5.9h-2.02c.2 2.01 1 3.84 2.21 5.32l1.43-1.43c-.86-1.1-1.44-2.43-1.62-3.89zm10.93-1c0-1.66-1.34-3-3-3s-3 1.34-3 3 1.34 3 3 3 3-1.34 3-3zm3.31 4.9l1.43 1.43c1.21-1.48 2.01-3.32 2.21-5.32h-2.02c-.18 1.45-.76 2.78-1.62 3.89zm-5.31 3.03v2.02c2.01-.2 3.84-1 5.32-2.21l-1.43-1.43c-1.1.86-2.43 1.44-3.89 1.62zm-7.32-.19c1.48 1.21 3.32 2.01 5.32 2.21v-2.02c-1.46-.18-2.79-.76-3.9-1.62l-1.42 1.43z\"/></g>\n<g id=\"filter-vintage\"><path d=\"M18.7 12.4c-.28-.16-.57-.29-.86-.4.29-.11.58-.24.86-.4 1.92-1.11 2.99-3.12 3-5.19-1.79-1.03-4.07-1.11-6 0-.28.16-.54.35-.78.54.05-.31.08-.63.08-.95 0-2.22-1.21-4.15-3-5.19-1.79 1.04-3 2.97-3 5.19 0 .32.03.64.08.95-.24-.2-.5-.39-.78-.55-1.92-1.11-4.2-1.03-6 0 0 2.07 1.07 4.08 3 5.19.28.16.57.29.86.4-.29.11-.58.24-.86.4-1.92 1.11-2.99 3.12-3 5.19 1.79 1.03 4.07 1.11 6 0 .28-.16.54-.35.78-.54-.05.32-.08.64-.08.96 0 2.22 1.21 4.15 3 5.19 1.79-1.04 3-2.97 3-5.19 0-.32-.03-.64-.08-.95.24.2.5.38.78.54 1.92 1.11 4.2 1.03 6 0-.01-2.07-1.08-4.08-3-5.19zm-6.7 3.6c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z\"/></g>\n<g id=\"flare\"><path d=\"M7 11h-6v2h6v-2zm2.17-3.24l-2.12-2.12-1.41 1.41 2.12 2.12 1.41-1.41zm3.83-6.76h-2v6h2v-6zm5.36 6.05l-1.41-1.41-2.12 2.12 1.41 1.41 2.12-2.12zm-1.36 3.95v2h6v-2h-6zm-5-2c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm2.83 7.24l2.12 2.12 1.41-1.41-2.12-2.12-1.41 1.41zm-9.19.71l1.41 1.41 2.12-2.12-1.41-1.41-2.12 2.12zm5.36 6.05h2v-6h-2v6z\"/></g>\n<g id=\"flash-auto\"><path d=\"M3 2v12h3v9l7-12h-4l4-9h-10zm16 0h-2l-3.2 9h1.9l.7-2h3.2l.7 2h1.9l-3.2-9zm-2.15 5.65l1.15-3.65 1.15 3.65h-2.3z\"/></g>\n<g id=\"flash-off\"><path d=\"M3.27 3l-1.27 1.27 5 5v3.73h3v9l3.58-6.14 4.15 4.14 1.27-1.27-15.73-15.73zm13.73 7h-4l4-8h-10v2.18l8.46 8.46 1.54-2.64z\"/></g>\n<g id=\"flash-on\"><path d=\"M7 2v11h3v9l7-12h-4l4-8z\"/></g>\n<g id=\"flip\"><path d=\"M15 21h2v-2h-2v2zm4-12h2v-2h-2v2zm-16-4v14c0 1.1.9 2 2 2h4v-2h-4v-14h4v-2h-4c-1.1 0-2 .9-2 2zm16-2v2h2c0-1.1-.9-2-2-2zm-8 20h2v-22h-2v22zm8-6h2v-2h-2v2zm-4-12h2v-2h-2v2zm4 8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2z\"/></g>\n<g id=\"gradient\"><path d=\"M11 9h2v2h-2zm-2 2h2v2h-2zm4 0h2v2h-2zm2-2h2v2h-2zm-8 0h2v2h-2zm12-6h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 15h-2v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2h-2v-2h-2v2h-2v-2h2v-2h-2v-6h14v6z\"/></g>\n<g id=\"grain\"><path d=\"M10 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-4 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"grid-off\"><path d=\"M8 4v1.45l2 2v-3.45h4v4h-3.45l2 2h1.45v1.45l2 2v-3.45h4v4h-3.45l2 2h1.45v1.45l2 2v-15.45c0-1.1-.9-2-2-2h-15.45l2 2h1.45zm8 0h4v4h-4v-4zm-14.73-2.73l-1.27 1.28 2 2v15.45c0 1.1.9 2 2 2h15.46l2 2 1.27-1.27-21.46-21.46zm8.73 11.28l1.45 1.45h-1.45v-1.45zm-6-6l1.45 1.45h-1.45v-1.45zm4 13.45h-4v-4h4v4zm0-6h-4v-4h3.45l.55.55v3.45zm6 6h-4v-4h3.45l.55.54v3.46zm2 0v-1.46l1.46 1.46h-1.46z\"/></g>\n<g id=\"grid-on\"><path d=\"M20 2h-16c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 18h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4v-4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4v-4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4v-4h4v4z\"/></g>\n<g id=\"hdr-off\"><path d=\"M18 17l-14.73-14.73-1.27 1.28 4 4v3.45h-2v-4h-2v10h2v-4h2v4h2v-7.45l1 1v6.45h4c.67 0 1.26-.33 1.62-.84l6.34 6.34 1.27-1.27-4.23-4.23zm-5-2h-2v-2.45l2 2v.45zm5-2h1l.82 3.27.73.73h1.45l-1.19-4.17c.7-.31 1.19-1.01 1.19-1.83v-2c0-1.1-.9-2-2-2h-4v5.45l2 2v-1.45zm0-4h2v2h-2v-2zm-3 2.45v-2.45c0-1.1-.9-2-2-2h-2.45l4.45 4.45z\"/></g>\n<g id=\"hdr-on\"><path d=\"M6 11h-2v-4h-2v10h2v-4h2v4h2v-10h-2v4zm7-4h-4v10h4c1.1 0 2-.9 2-2v-6c0-1.1-.9-2-2-2zm0 8h-2v-6h2v6zm9-4v-2c0-1.1-.9-2-2-2h-4v10h2v-4h1l1 4h2l-1.19-4.17c.7-.31 1.19-1.01 1.19-1.83zm-2 0h-2v-2h2v2z\"/></g>\n<g id=\"hdr-plus-off\"><path d=\"M9.5 5h1.5v2.45l2 2v-4.45h3.5c.83 0 1.5.67 1.5 1.5v3c0 .83-.67 1.5-1.5 1.5h-1.95l7.52 7.52c1.22-1.88 1.93-4.11 1.93-6.52 0-6.63-5.37-12-12-12-2.41 0-4.64.71-6.52 1.93l4.02 4.02v-.95zm0 9.5h-2v1h2v-1zm7-8h-2v3h2v-3zm-16-4.45l2.28 2.28c-1.74 2.07-2.78 4.75-2.78 7.67 0 6.63 5.37 12 12 12 2.92 0 5.6-1.04 7.68-2.78l2.28 2.28 1.27-1.27-21.46-21.46-1.27 1.28zm12.5 13.45h.96l2.54 2.55v.95h-1.5v-2h-2v-1.5zm-7-7.95l1.5 1.5v1.95h-1.5v-3.45zm0 5.45h3.5c.83 0 1.5.67 1.5 1.5v1c0 .62-.38 1.15-.91 1.38l.91 2.12h-1.5l-.86-2h-1.14v2h-1.5v-6z\"/></g>\n<g id=\"hdr-plus-on\"><path d=\"M12 0c-6.63 0-12 5.37-12 12s5.37 12 12 12 12-5.37 12-12-5.37-12-12-12zm-1 15.5c0 .62-.37 1.15-.91 1.38l.91 2.12h-1.5l-.86-2h-1.14v2h-1.5v-6h3.5c.83 0 1.5.67 1.5 1.5v1zm0-4.5h-1.5v-2.5h-2v2.5h-1.5v-6h1.5v2h2v-2h1.5v6zm2-6h3.5c.83 0 1.5.67 1.5 1.5v3c0 .83-.67 1.5-1.5 1.5h-3.5v-6zm5.5 12h-2v2h-1.5v-2h-2v-1.5h2v-2h1.5v2h2v1.5zm-11-1.5h2v-1h-2v1zm9-9h-2v3h2v-3z\"/></g>\n<g id=\"hdr-strong\"><path d=\"M17 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-12 2c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"hdr-weak\"><path d=\"M5 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm12-2c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z\"/></g>\n<g id=\"healing\"><path d=\"M17.73 12.02l3.98-3.98c.39-.39.39-1.02 0-1.41l-4.34-4.34c-.39-.39-1.02-.39-1.41 0l-3.98 3.98-3.98-3.98c-.2-.19-.45-.29-.71-.29-.25 0-.51.1-.7.29l-4.34 4.34c-.39.39-.39 1.02 0 1.41l3.98 3.98-3.98 3.98c-.39.39-.39 1.02 0 1.41l4.34 4.34c.39.39 1.02.39 1.41 0l3.98-3.98 3.98 3.98c.2.2.45.29.71.29.26 0 .51-.1.71-.29l4.34-4.34c.39-.39.39-1.02 0-1.41l-3.99-3.98zm-5.73-3.02c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-4.71 1.96l-3.63-3.62 3.63-3.63 3.62 3.62-3.62 3.63zm2.71 2.04c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2 2c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2-4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2.66 9.34l-3.63-3.62 3.63-3.63 3.62 3.62-3.62 3.63z\"/></g>\n<g id=\"image\"><path d=\"M21 19v-14c0-1.1-.9-2-2-2h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zm-12.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"image-aspect-ratio\"><path d=\"M16 10h-2v2h2v-2zm0 4h-2v2h2v-2zm-8-4h-2v2h2v-2zm4 0h-2v2h2v-2zm8-6h-16c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 14h-16v-12h16v12z\"/></g>\n<g id=\"iso\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-13.5 4.5h2v-2h1.5v2h2v1.5h-2v2h-1.5v-2h-2v-1.5zm13.5 11.5h-14l14-14v14zm-2-2v-1.5h-5v1.5h5z\"/></g>\n<g id=\"landscape\"><path d=\"M14 6l-3.75 5 2.85 3.8-1.6 1.2c-1.69-2.25-4.5-6-4.5-6l-6 8h22l-9-12z\"/></g>\n<g id=\"leak-add\"><path d=\"M6 3h-3v3c1.66 0 3-1.34 3-3zm8 0h-2c0 4.97-4.03 9-9 9v2c6.08 0 11-4.93 11-11zm-4 0h-2c0 2.76-2.24 5-5 5v2c3.87 0 7-3.13 7-7zm0 18h2c0-4.97 4.03-9 9-9v-2c-6.07 0-11 4.93-11 11zm8 0h3v-3c-1.66 0-3 1.34-3 3zm-4 0h2c0-2.76 2.24-5 5-5v-2c-3.87 0-7 3.13-7 7z\"/></g>\n<g id=\"leak-remove\"><path d=\"M10 3h-2c0 .37-.04.72-.12 1.06l1.59 1.59c.34-.81.53-1.71.53-2.65zm-7 1.27l2.84 2.84c-.81.56-1.78.89-2.84.89v2c1.61 0 3.09-.55 4.27-1.46l1.43 1.43c-1.56 1.27-3.54 2.03-5.7 2.03v2c2.71 0 5.19-.99 7.11-2.62l2.5 2.5c-1.62 1.93-2.61 4.41-2.61 7.12h2c0-2.16.76-4.14 2.03-5.69l1.43 1.43c-.91 1.17-1.46 2.65-1.46 4.26h2c0-1.06.33-2.03.89-2.84l2.84 2.84 1.27-1.27-16.73-16.73-1.27 1.27zm11-1.27h-2c0 1.5-.37 2.91-1.02 4.16l1.46 1.46c.98-1.64 1.56-3.56 1.56-5.62zm5.94 13.12c.34-.08.69-.12 1.06-.12v-2c-.94 0-1.84.19-2.66.52l1.6 1.6zm-4.56-4.56l1.46 1.46c1.25-.65 2.66-1.02 4.16-1.02v-2c-2.06 0-3.98.58-5.62 1.56z\"/></g>\n<g id=\"lens\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z\"/></g>\n<g id=\"looks\"><path d=\"M12 10c-3.86 0-7 3.14-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.86-3.14-7-7-7zm0-4c-6.07 0-11 4.93-11 11h2c0-4.96 4.04-9 9-9s9 4.04 9 9h2c0-6.07-4.93-11-11-11z\"/></g>\n<g id=\"looks-3\"><path d=\"M19.01 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 7.5c0 .83-.67 1.5-1.5 1.5.83 0 1.5.67 1.5 1.5v1.5c0 1.11-.9 2-2 2h-4v-2h4v-2h-2v-2h2v-2h-4v-2h4c1.1 0 2 .89 2 2v1.5z\"/></g>\n<g id=\"looks-4\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 14h-2v-4h-4v-6h2v4h2v-4h2v10z\"/></g>\n<g id=\"looks-5\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2h-4v-2h4v-2h-4v-6h6v2z\"/></g>\n<g id=\"looks-6\"><path d=\"M11 15h2v-2h-2v2zm8-12h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2h-2c-1.1 0-2-.89-2-2v-6c0-1.11.9-2 2-2h4v2z\"/></g>\n<g id=\"looks-one\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-5 14h-2v-8h-2v-2h4v10z\"/></g>\n<g id=\"looks-two\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-4 8c0 1.11-.9 2-2 2h-2v2h4v2h-6v-4c0-1.11.9-2 2-2h2v-2h-4v-2h4c1.1 0 2 .89 2 2v2z\"/></g>\n<g id=\"loupe\"><path d=\"M13 7h-2v4h-4v2h4v4h2v-4h4v-2h-4v-4zm-1-5c-5.51 0-10 4.49-10 10s4.49 10 10 10h8c1.1 0 2-.9 2-2v-8c0-5.51-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"movie-creation\"><path d=\"M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4h-2l2 4h-3l-2-4h-1c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-14h-4z\"/></g>\n<g id=\"nature\"><path d=\"M13 16.12c3.47-.41 6.17-3.36 6.17-6.95 0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89v3.94h-6v2h14v-2h-6v-3.88z\"/></g>\n<g id=\"nature-people\"><path d=\"M22.17 9.17c0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89v3.94h-8v-3h1v-4c0-.55-.45-1-1-1h-3c-.55 0-1 .45-1 1v4h1v5h16v-2h-3v-3.88c3.47-.41 6.17-3.36 6.17-6.95zm-17.67 1.83c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5z\"/></g>\n<g id=\"navigate-before\"><path d=\"M15.41 7.41l-1.41-1.41-6 6 6 6 1.41-1.41-4.58-4.59z\"/></g>\n<g id=\"navigate-next\"><path d=\"M10 6l-1.41 1.41 4.58 4.59-4.58 4.59 1.41 1.41 6-6z\"/></g>\n<g id=\"palette\"><path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5h1.77c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3-4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3 4c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"panorama\"><path d=\"M23 18v-12c0-1.1-.9-2-2-2h-18c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-14.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"panorama-fisheye\"><path d=\"M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></g>\n<g id=\"panorama-horizontal\"><path d=\"M20 6.54v10.91c-2.6-.77-5.28-1.16-8-1.16-2.72 0-5.4.39-8 1.16v-10.91c2.6.77 5.28 1.16 8 1.16 2.72.01 5.4-.38 8-1.16m1.43-2.54c-.1 0-.2.02-.31.06-2.94 1.1-6.03 1.64-9.12 1.64-3.09 0-6.18-.55-9.12-1.64-.11-.04-.22-.06-.31-.06-.34 0-.57.23-.57.63v14.75c0 .39.23.62.57.62.1 0 .2-.02.31-.06 2.94-1.1 6.03-1.64 9.12-1.64 3.09 0 6.18.55 9.12 1.64.11.04.21.06.31.06.33 0 .57-.23.57-.63v-14.74c0-.4-.24-.63-.57-.63z\"/></g>\n<g id=\"panorama-vertical\"><path d=\"M19.94 21.12c-1.1-2.94-1.64-6.03-1.64-9.12 0-3.09.55-6.18 1.64-9.12.04-.11.06-.22.06-.31 0-.34-.23-.57-.63-.57h-14.74c-.4 0-.63.23-.63.57 0 .1.02.2.06.31 1.1 2.94 1.65 6.03 1.65 9.12 0 3.09-.55 6.18-1.64 9.12-.05.11-.07.22-.07.31 0 .33.23.57.63.57h14.75c.39 0 .63-.24.63-.57-.01-.1-.03-.2-.07-.31zm-13.4-1.12c.77-2.6 1.16-5.28 1.16-8 0-2.72-.39-5.4-1.16-8h10.91c-.77 2.6-1.16 5.28-1.16 8 0 2.72.39 5.4 1.16 8h-10.91z\"/></g>\n<g id=\"panorama-wide-angle\"><path d=\"M12 6c2.45 0 4.71.2 7.29.64.47 1.78.71 3.58.71 5.36 0 1.78-.24 3.58-.71 5.36-2.58.44-4.84.64-7.29.64s-4.71-.2-7.29-.64c-.47-1.78-.71-3.58-.71-5.36 0-1.78.24-3.58.71-5.36 2.58-.44 4.84-.64 7.29-.64m0-2c-2.73 0-5.22.24-7.95.72l-.93.16-.25.9c-.58 2.07-.87 4.15-.87 6.22s.29 4.15.87 6.22l.25.89.93.16c2.73.49 5.22.73 7.95.73s5.22-.24 7.95-.72l.93-.16.25-.89c.58-2.08.87-4.16.87-6.23s-.29-4.15-.87-6.22l-.25-.89-.93-.16c-2.73-.49-5.22-.73-7.95-.73z\"/></g>\n<g id=\"photo\"><path d=\"M21 19v-14c0-1.1-.9-2-2-2h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zm-12.5-5.5l2.5 3.01 3.5-4.51 4.5 6h-14l3.5-4.5z\"/></g>\n<g id=\"photo-album\"><path d=\"M18 2h-12c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 2h5v8l-2.5-1.5-2.5 1.5v-8zm0 15l3-3.86 2.14 2.58 3-3.86 3.86 5.14h-12z\"/></g>\n<g id=\"photo-camera\"><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2h-3.17l-1.83-2h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></g>\n<g id=\"photo-library\"><path d=\"M22 16v-12c0-1.1-.9-2-2-2h-12c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71 2.97-3.71 4 5h-12l3-4zm-9-6v14c0 1.1.9 2 2 2h14v-2h-14v-14h-2z\"/></g>\n<g id=\"photosphere\"><path d=\"M22.07 7.59c-1.7-3.88-5.56-6.59-10.07-6.59s-8.37 2.71-10.07 6.59c-.65.28-1.3.58-1.93.91v7c.63.33 1.28.63 1.93.91 1.7 3.88 5.56 6.59 10.07 6.59s8.37-2.71 10.07-6.59c.65-.28 1.29-.58 1.93-.91v-7c-.63-.33-1.28-.63-1.93-.91zm-10.07-5.09c3.31 0 6.23 1.7 7.93 4.28-2.58-.85-5.25-1.28-7.93-1.28-2.68 0-5.35.43-7.93 1.28 1.7-2.58 4.62-4.28 7.93-4.28zm0 19c-3.31 0-6.23-1.7-7.93-4.28 2.58.85 5.25 1.28 7.93 1.28 2.68 0 5.35-.43 7.93-1.28-1.7 2.58-4.62 4.28-7.93 4.28zm10.5-6.92l-.29.13c-1.08.51-2.21.92-3.35 1.27l-3.86-4.42-3 3.44-4-5-4.38 5.47c-.62-.23-1.23-.47-1.83-.75l-.29-.14v-5.16l.29-.13c6.4-2.99 14.02-2.99 20.42 0l.29.13v5.16z\"/></g>\n<g id=\"portrait\"><path d=\"M12 12.25c1.24 0 2.25-1.01 2.25-2.25s-1.01-2.25-2.25-2.25-2.25 1.01-2.25 2.25 1.01 2.25 2.25 2.25zm4.5 4c0-1.5-3-2.25-4.5-2.25s-4.5.75-4.5 2.25v.75h9v-.75zm2.5-13.25h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"remove-red-eye\"><path d=\"M12 4.5c-5 0-9.27 3.11-11 7.5 1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zm0 12.5c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"/></g>\n<g id=\"rotate-left\"><path d=\"M7.11 8.53l-1.41-1.42c-.9 1.16-1.46 2.5-1.63 3.89h2.02c.14-.87.49-1.72 1.02-2.47zm-1.02 4.47h-2.02c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61v-2.03c-.87-.15-1.71-.49-2.46-1.03l-1.44 1.45zm5.9-14.25v-3.07l-4.55 4.55 4.55 4.45v-3.91c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"/></g>\n<g id=\"rotate-right\"><path d=\"M15.55 5.55l-4.55-4.55v3.07c-3.94.49-7 3.85-7 7.93s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91v3.91l4.55-4.45zm4.38 5.45c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zm-6.93 6.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z\"/></g>\n<g id=\"slideshow\"><path d=\"M10 8v8l5-4-5-4zm9-5h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-14h14v14z\"/></g>\n<g id=\"straighten\"><path d=\"M21 6h-18c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-8c0-1.1-.9-2-2-2zm0 10h-18v-8h2v4h2v-4h2v4h2v-4h2v4h2v-4h2v4h2v-4h2v8z\"/></g>\n<g id=\"style\"><path d=\"M2.53 19.65l1.34.56v-9.03l-2.43 5.86c-.41 1.02.08 2.19 1.09 2.61zm19.5-3.7l-4.96-11.97c-.31-.75-1.04-1.21-1.81-1.23-.26 0-.53.04-.79.15l-7.37 3.05c-.75.31-1.21 1.03-1.23 1.8-.01.27.04.54.15.8l4.96 11.97c.31.76 1.05 1.22 1.83 1.23.26 0 .52-.05.77-.15l7.36-3.05c1.02-.42 1.51-1.59 1.09-2.6zm-14.15-7.2c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-2 11c0 1.1.9 2 2 2h1.45l-3.45-8.34v6.34z\"/></g>\n<g id=\"switch-camera\"><path d=\"M20 4h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-5 11.5v-2.5h-6v2.5l-3.5-3.5 3.5-3.5v2.5h6v-2.5l3.5 3.5-3.5 3.5z\"/></g>\n<g id=\"switch-video\"><path d=\"M18 9.5v-3.5c0-.55-.45-1-1-1h-14c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h14c.55 0 1-.45 1-1v-3.5l4 4v-13l-4 4zm-5 6v-2.5h-6v2.5l-3.5-3.5 3.5-3.5v2.5h6v-2.5l3.5 3.5-3.5 3.5z\"/></g>\n<g id=\"tag-faces\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5h-10.22c.8 2.04 2.78 3.5 5.11 3.5z\"/></g>\n<g id=\"texture\"><path d=\"M19.51 3.08l-16.43 16.43c.09.34.27.65.51.9.25.24.56.42.9.51l16.44-16.43c-.19-.69-.73-1.23-1.42-1.41zm-7.63-.08l-8.88 8.88v2.83l11.71-11.71h-2.83zm-6.88 0c-1.1 0-2 .9-2 2v2l4-4h-2zm14 18c.55 0 1.05-.22 1.41-.59.37-.36.59-.86.59-1.41v-2l-4 4h2zm-9.71 0h2.83l8.88-8.88v-2.83l-11.71 11.71z\"/></g>\n<g id=\"timelapse\"><path d=\"M16.24 7.76c-1.17-1.17-2.7-1.76-4.24-1.76v6l-4.24 4.24c2.34 2.34 6.14 2.34 8.49 0 2.34-2.34 2.34-6.14-.01-8.48zm-4.24-5.76c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"timer-10\"><path d=\"M0 7.72v1.68l3-1v9.6h2v-12h-.25l-4.75 1.72zm23.78 6.65c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39 0-.14.03-.28.09-.41.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59-.43-.15-.92-.22-1.46-.22-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.69.23.96c.15.28.36.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02zm-9.96-7.32c-.34-.4-.75-.7-1.23-.88-.47-.18-1.01-.27-1.59-.27-.58 0-1.11.09-1.59.27-.48.18-.89.47-1.23.88-.34.41-.6.93-.79 1.59-.18.65-.28 1.45-.28 2.39v1.92c0 .94.09 1.74.28 2.39.19.66.45 1.19.8 1.6.34.41.75.71 1.23.89.48.18 1.01.28 1.59.28.59 0 1.12-.09 1.59-.28.48-.18.88-.48 1.22-.89.34-.41.6-.94.78-1.6.18-.65.28-1.45.28-2.39v-1.92c0-.94-.09-1.74-.28-2.39-.18-.66-.44-1.19-.78-1.59zm-.92 6.17c0 .6-.04 1.11-.12 1.53-.08.42-.2.76-.36 1.02-.16.26-.36.45-.59.57-.23.12-.51.18-.82.18-.3 0-.58-.06-.82-.18s-.44-.31-.6-.57c-.16-.26-.29-.6-.38-1.02-.09-.42-.13-.93-.13-1.53v-2.5c0-.6.04-1.11.13-1.52.09-.41.21-.74.38-1 .16-.25.36-.43.6-.55.24-.11.51-.17.81-.17.31 0 .58.06.81.17.24.11.44.29.6.55.16.25.29.58.37.99.08.41.13.92.13 1.52v2.51z\"/></g>\n<g id=\"timer\"><path d=\"M15 1h-6v2h6v-2zm-4 13h2v-6h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42c-1.55-1.24-3.5-1.98-5.62-1.98-4.97 0-9 4.03-9 9s4.02 9 9 9 9-4.03 9-9c0-2.12-.74-4.07-1.97-5.61zm-7.03 12.61c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"timer-3\"><path d=\"M11.61 12.97c-.16-.24-.36-.46-.62-.65-.25-.19-.56-.35-.93-.48.3-.14.57-.3.8-.5.23-.2.42-.41.57-.64.15-.23.27-.46.34-.71.08-.24.11-.49.11-.73 0-.55-.09-1.04-.28-1.46-.18-.42-.44-.77-.78-1.06-.33-.28-.73-.5-1.2-.64-.45-.13-.97-.2-1.53-.2-.55 0-1.06.08-1.52.24-.47.17-.87.4-1.2.69-.33.29-.6.63-.78 1.03-.2.39-.29.83-.29 1.29h1.98c0-.26.05-.49.14-.69.09-.2.22-.38.38-.52.17-.14.36-.25.58-.33.22-.08.46-.12.73-.12.61 0 1.06.16 1.36.47.3.31.44.75.44 1.32 0 .27-.04.52-.12.74-.08.22-.21.41-.38.57-.17.16-.38.28-.63.37-.25.09-.55.13-.89.13h-1.17v1.57h1.18c.34 0 .64.04.91.11.27.08.5.19.69.35.19.16.34.36.44.61.1.24.16.54.16.87 0 .62-.18 1.09-.53 1.42-.35.33-.84.49-1.45.49-.29 0-.56-.04-.8-.13-.24-.08-.44-.2-.61-.36-.17-.16-.3-.34-.39-.56-.09-.22-.14-.46-.14-.72h-1.99c0 .55.11 1.03.32 1.45.21.42.5.77.86 1.05s.77.49 1.24.63.96.21 1.48.21c.57 0 1.09-.08 1.58-.23.49-.15.91-.38 1.26-.68.36-.3.64-.66.84-1.1.2-.43.3-.93.3-1.48 0-.29-.04-.58-.11-.86-.08-.25-.19-.51-.35-.76zm9.26 1.4c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39s.03-.28.09-.41c.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59-.43-.15-.92-.22-1.46-.22-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.68.23.96c.15.28.37.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02z\"/></g>\n<g id=\"timer-auto\"><path d=\"M12 4c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 10c-2.67 0-8 1.34-8 4v2h16v-2c0-2.67-5.33-4-8-4z\"/></g>\n<g id=\"timer-off\"><path d=\"M19.04 4.55l-1.42 1.42c-1.55-1.23-3.5-1.97-5.62-1.97-1.83 0-3.53.55-4.95 1.48l1.46 1.46c1.02-.59 2.22-.94 3.49-.94 3.87 0 7 3.13 7 7 0 1.27-.35 2.47-.94 3.49l1.45 1.45c.94-1.41 1.49-3.11 1.49-4.94 0-2.12-.74-4.07-1.97-5.61l1.42-1.42-1.41-1.42zm-4.04-3.55h-6v2h6v-2zm-4 8.44l2 2v-3.44h-2v1.44zm-7.98-5.44l-1.27 1.27 2.75 2.76c-.95 1.42-1.5 3.13-1.5 4.97 0 4.97 4.02 9 9 9 1.84 0 3.55-.55 4.98-1.5l2.5 2.5 1.27-1.27-7.71-7.71-10.02-10.02zm8.98 16c-3.87 0-7-3.13-7-7 0-1.28.35-2.48.95-3.52l9.56 9.56c-1.03.61-2.23.96-3.51.96z\"/></g>\n<g id=\"tonality\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-1 17.93c-3.94-.49-7-3.85-7-7.93s3.05-7.44 7-7.93v15.86zm2-15.86c1.03.13 2 .45 2.87.93h-2.87v-.93zm0 2.93h5.24c.25.31.48.65.68 1h-5.92v-1zm0 3h6.74c.08.33.15.66.19 1h-6.93v-1zm0 9.93v-.93h2.87c-.87.48-1.84.8-2.87.93zm5.24-2.93h-5.24v-1h5.92c-.2.35-.43.69-.68 1zm1.5-3h-6.74v-1h6.93c-.04.34-.11.67-.19 1z\"/></g>\n<g id=\"transform\"><path d=\"M22 18v-2h-14v-12h2l-3-3-3 3h2v2h-4v2h4v8c0 1.1.9 2 2 2h8v2h-2l3 3 3-3h-2v-2h4zm-12-10h6v6h2v-6c0-1.1-.9-2-2-2h-6v2z\"/></g>\n<g id=\"tune\"><path d=\"M3 17v2h6v-2h-6zm0-12v2h10v-2h-10zm10 16v-2h8v-2h-8v-2h-2v6h2zm-6-12v2h-4v2h4v2h2v-6h-2zm14 4v-2h-10v2h10zm-6-4h2v-2h4v-2h-4v-2h-2v6z\"/></g>\n<g id=\"wb-auto\"><path d=\"M6.85 12.65h2.3l-1.15-3.65-1.15 3.65zm15.15-5.65l-1.2 6.29-1.5-6.29h-1.6l-1.49 6.29-1.21-6.29h-.76c-1.47-1.83-3.71-3-6.24-3-4.42 0-8 3.58-8 8s3.58 8 8 8c3.13 0 5.84-1.81 7.15-4.43l.1.43h1.75l1.5-6.1 1.5 6.1h1.75l2.05-9h-1.8zm-11.7 9l-.7-2h-3.2l-.7 2h-1.9l3.2-9h2l3.2 9h-1.9z\"/></g>\n<g id=\"wb-cloudy\"><path d=\"M19.36 10.04c-.69-3.45-3.72-6.04-7.36-6.04-2.89 0-5.4 1.64-6.65 4.04-3.01.32-5.35 2.87-5.35 5.96 0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.64-4.96z\"/></g>\n<g id=\"wb-incandescent\"><path d=\"M3.55 18.54l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8zm7.45 3.91h2v-2.95h-2v2.95zm-7-11.95h-3v2h3v-2zm11-4.19v-4.81h-6v4.81c-1.79 1.04-3 2.97-3 5.19 0 3.31 2.69 6 6 6s6-2.69 6-6c0-2.22-1.21-4.15-3-5.19zm5 4.19v2h3v-2h-3zm-2.76 7.66l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4z\"/></g>\n<g id=\"wb-irradescent\"><path d=\"M5 14.5h14v-6h-14v6zm6-13.95v2.95h2v-2.95h-2zm8.04 2.5l-1.79 1.79 1.41 1.41 1.8-1.79-1.42-1.41zm-6.04 19.4v-2.95h-2v2.95h2zm7.45-3.91l-1.8-1.79-1.41 1.41 1.79 1.8 1.42-1.42zm-16.9-14.08l1.79 1.79 1.41-1.41-1.79-1.79-1.41 1.41zm1.41 15.49l1.79-1.8-1.41-1.41-1.79 1.79 1.41 1.42z\"/></g>\n<g id=\"wb-sunny\"><path d=\"M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zm-2.76 5.66h-3v2h3v-2zm9-9.95h-2v2.95h2v-2.95zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zm2.76-7.66v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2v-2.95h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/maps-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"maps\" iconSize=\"24\">\n<svg><defs>\n<g id=\"beenhere\"><path d=\"M19 1h-14c-1.1 0-1.99.9-1.99 2l-.01 12.93c0 .69.35 1.3.88 1.66l8.12 5.41 8.11-5.41c.53-.36.88-.97.88-1.66l.01-12.93c0-1.1-.9-2-2-2zm-9 15l-5-5 1.41-1.41 3.59 3.58 7.59-7.59 1.41 1.42-9 9z\"/></g>\n<g id=\"directions\"><path d=\"M21.71 11.29l-9-9c-.39-.39-1.02-.39-1.41 0l-9 9c-.39.39-.39 1.02 0 1.41l9 9c.39.39 1.02.39 1.41 0l9-9c.39-.38.39-1.01 0-1.41zm-7.71 3.21v-2.5h-4v3h-2v-4c0-.55.45-1 1-1h5v-2.5l3.5 3.5-3.5 3.5z\"/></g>\n<g id=\"directions-bike\"><path d=\"M16 4.8c.99 0 1.8-.81 1.8-1.8s-.81-1.8-1.8-1.8c-1 0-1.8.81-1.8 1.8s.8 1.8 1.8 1.8zm3 7.2c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0 8.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5zm-4.2-10.5h4.2v-1.8h-3.2l-1.93-3.27c-.3-.5-.84-.83-1.46-.83-.47 0-.89.19-1.2.5l-3.7 3.7c-.32.3-.51.73-.51 1.2 0 .63.33 1.16.85 1.47l3.35 2.03v5h1.8v-6.48l-2.25-1.67 2.32-2.33 1.73 2.48zm-9.8 2c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0 8.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z\"/></g>\n<g id=\"directions-bus\"><path d=\"M4 16c0 .88.39 1.67 1 2.22v1.78c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h8v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1.78c.61-.55 1-1.34 1-2.22v-10c0-3.5-3.58-4-8-4s-8 .5-8 4v10zm3.5 1c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm9 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-12v-5h12v5z\"/></g>\n<g id=\"directions-car\"><path d=\"M18.92 6.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"directions-ferry\"><path d=\"M20 21c-1.39 0-2.78-.47-4-1.32-2.44 1.71-5.56 1.71-8 0-1.22.85-2.61 1.32-4 1.32h-2v2h2c1.38 0 2.74-.35 4-.99 2.52 1.29 5.48 1.29 8 0 1.26.65 2.62.99 4 .99h2v-2h-2zm-16.05-2h.05c1.6 0 3.02-.88 4-2 .98 1.12 2.4 2 4 2s3.02-.88 4-2c.98 1.12 2.4 2 4 2h.05l1.89-6.68c.08-.26.06-.54-.06-.78s-.34-.42-.6-.5l-1.28-.42v-4.62c0-1.1-.9-2-2-2h-3v-3h-6v3h-3c-1.1 0-2 .9-2 2v4.62l-1.29.42c-.26.08-.48.26-.6.5s-.15.52-.06.78l1.9 6.68zm2.05-13h12v3.97l-6-1.97-6 1.97v-3.97z\"/></g>\n<g id=\"directions-subway\"><path d=\"M12 2c-4.42 0-8 .5-8 4v9.5c0 1.93 1.57 3.5 3.5 3.5l-1.5 1.5v.5h12v-.5l-1.5-1.5c1.93 0 3.5-1.57 3.5-3.5v-9.5c0-3.5-3.58-4-8-4zm-4.5 15c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3.5-6h-5v-5h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5v-5h5v5z\"/></g>\n<g id=\"directions-train\"><path d=\"M4 15.5c0 1.93 1.57 3.5 3.5 3.5l-1.5 1.5v.5h12v-.5l-1.5-1.5c1.93 0 3.5-1.57 3.5-3.5v-10.5c0-3.5-3.58-4-8-4s-8 .5-8 4v10.5zm8 1.5c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm6-7h-12v-5h12v5z\"/></g>\n<g id=\"directions-transit\"><path d=\"M12 2c-4.42 0-8 .5-8 4v9.5c0 1.93 1.57 3.5 3.5 3.5l-1.5 1.5v.5h12v-.5l-1.5-1.5c1.93 0 3.5-1.57 3.5-3.5v-9.5c0-3.5-3.58-4-8-4zm-4.5 15c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm3.5-6h-5v-5h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5v-5h5v5z\"/></g>\n<g id=\"directions-walk\"><path d=\"M14 3.8c.99 0 1.8-.81 1.8-1.8 0-1-.81-1.8-1.8-1.8-1 0-1.8.81-1.8 1.8s.8 1.8 1.8 1.8zm.12 6.2h4.88v-1.8h-3.62l-2-3.33c-.3-.5-.84-.83-1.46-.83-.17 0-.34.03-.49.07l-5.43 1.69v5.2h1.8v-3.67l2.11-.66-3.91 15.33h1.8l2.87-8.11 2.33 3.11v5h1.8v-6.41l-2.49-4.54.73-2.87 1.08 1.82z\"/></g>\n<g id=\"earth\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18.2c-1.12 0-2.19-.23-3.17-.64-.62-1.48-.61-2.64 1.12-2.06 0 0 3.92 1.52 8.04.08-1.49 1.61-3.62 2.62-5.99 2.62zm7.1-4.1c-.94.37-2.11 1-3.96 1-1.88 0-3.53-.75-5.58-1.4-1.86-.59-2.55-1.5-3.84-1.5-.66 0-.98.66-1.17 1.22-.47-1.04-.75-2.2-.75-3.42 0-.8.12-1.58.34-2.31 1.26-1.59 3.19-2.57 5.95-.43 0 0 6.23 4.67 9.79 4.97-.18.66-.45 1.29-.78 1.87zm-6.7-8.54c-2.8-2.65-5.1-1.91-6.09-1.46.75-.72 1.63-1.3 2.6-1.7 2.78-.1 5.91.44 7.65 2.91 0 0 2.42 4.18 3.29 2.34.22.74.34 1.53.34 2.34 0 .3-.02.59-.05.88-2.02-.22-4.81-2.54-7.74-5.31z\"/></g>\n<g id=\"explore-nearby\"><path d=\"M12 7.2c-2.1 0-3.8 1.7-3.8 3.8 0 3 3.8 6.5 3.8 6.5s3.8-3.5 3.8-6.5c0-2.1-1.7-3.8-3.8-3.8zm0 5.3c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm0-10.5c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/></g>\n<g id=\"flight\"><path d=\"M10.18 9\"/><path d=\"M21 16v-2l-8-5v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z\"/></g>\n<g id=\"hotel\"><path d=\"M7 13c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7h-8v-9h-2v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z\"/></g>\n<g id=\"layers\"><path d=\"M11.99 18.54l-7.37-5.73-1.62 1.26 9 7 9-7-1.63-1.27-7.38 5.74zm.01-2.54l7.36-5.73 1.64-1.27-9-7-9 7 1.63 1.27 7.37 5.73z\"/></g>\n<g id=\"layers-clear\"><path d=\"M19.81 14.99l1.19-.92-1.43-1.43-1.19.92 1.43 1.43zm-.45-4.72l1.64-1.27-9-7-2.91 2.27 7.87 7.88 2.4-1.88zm-16.09-9.27l-1.27 1.27 4.22 4.22-3.22 2.51 1.63 1.27 7.37 5.73 2.1-1.63 1.43 1.43-3.53 2.74-7.37-5.73-1.63 1.26 9 7 4.95-3.85 3.78 3.78 1.27-1.27-18.73-18.73z\"/></g>\n<g id=\"local-airport\"><path d=\"M21 16v-2l-8-5v-5.5c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z\"/></g>\n<g id=\"local-atm\"><path d=\"M11 17h2v-1h1c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1h-3v-1h4v-2h-2v-1h-2v1h-1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1h3v1h-4v2h2v1zm9-13h-16c-1.11 0-1.99.89-1.99 2l-.01 12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-12c0-1.11-.89-2-2-2zm0 14h-16v-12h16v12z\"/></g>\n<g id=\"local-attraction\"><path d=\"M20 12c0-1.1.9-2 2-2v-4c0-1.1-.9-2-2-2h-16c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8l-3.58-2.3-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25 1.55-3.94 1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z\"/></g>\n<g id=\"local-bar\"><path d=\"M11 13v6h-5v2h12v-2h-5v-6l8-8v-2h-18v2l8 8zm-3.5-6l-2-2h13l-2 2h-9z\"/></g>\n<g id=\"local-cafe\"><path d=\"M20 3h-16v10c0 2.21 1.79 4 4 4h6c2.21 0 4-1.79 4-4v-3h2c1.11 0 2-.89 2-2v-3c0-1.11-.89-2-2-2zm0 5h-2v-3h2v3zm-18 13h18v-2h-18v2z\"/></g>\n<g id=\"local-car-wash\"><path d=\"M17 5c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm-5 0c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm-5 0c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm11.92 3.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"local-convenience-store\"><path d=\"M19 7v-3h-14v3h-3v13h8v-4h4v4h8v-13h-3zm-8 3h-2v1h2v1h-3v-3h2v-1h-2v-1h3v3zm5 2h-1v-2h-2v-3h1v2h1v-2h1v5z\"/></g>\n<g id=\"local-drink\"><path d=\"M3 2l2.01 18.23c.12 1 .96 1.77 1.99 1.77h10c1.03 0 1.87-.77 1.99-1.77l2.01-18.23h-18zm9 17c-1.66 0-3-1.34-3-3 0-2 3-5.4 3-5.4s3 3.4 3 5.4c0 1.66-1.34 3-3 3zm6.33-11h-12.66l-.44-4h13.53l-.43 4z\"/></g>\n<g id=\"local-florist\"><path d=\"M12 22c4.97 0 9-4.03 9-9-4.97 0-9 4.03-9 9zm-6.4-11.75c0 1.38 1.12 2.5 2.5 2.5.53 0 1.01-.16 1.42-.44l-.02.19c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5l-.02-.19c.4.28.89.44 1.42.44 1.38 0 2.5-1.12 2.5-2.5 0-1-.59-1.85-1.43-2.25.84-.4 1.43-1.25 1.43-2.25 0-1.38-1.12-2.5-2.5-2.5-.53 0-1.01.16-1.42.44l.02-.19c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5l.02.19c-.4-.28-.89-.44-1.42-.44-1.38 0-2.5 1.12-2.5 2.5 0 1 .59 1.85 1.43 2.25-.84.4-1.43 1.25-1.43 2.25zm6.4-4.75c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5-2.5-1.12-2.5-2.5 1.12-2.5 2.5-2.5zm-9 7.5c0 4.97 4.03 9 9 9 0-4.97-4.03-9-9-9z\"/></g>\n<g id=\"local-gas-station\"><path d=\"M19.77 7.23l.01-.01-3.72-3.72-1.06 1.06 2.11 2.11c-.94.36-1.61 1.26-1.61 2.33 0 1.38 1.12 2.5 2.5 2.5.36 0 .69-.08 1-.21v7.21c0 .55-.45 1-1 1s-1-.45-1-1v-4.5c0-1.1-.9-2-2-2h-1v-7c0-1.1-.9-2-2-2h-6c-1.1 0-2 .9-2 2v16h10v-7.5h1.5v5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5v-9.5c0-.69-.28-1.32-.73-1.77zm-7.77 2.77h-6v-5h6v5zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"local-grocery-store\"><path d=\"M7 18c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-6-16v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2h-11.58c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1h-14.79l-.94-2h-3.27zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"local-hospital\"><path d=\"M19 3h-14c-1.1 0-1.99.9-1.99 2l-.01 14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-1 11h-4v4h-4v-4h-4v-4h4v-4h4v4h4v4z\"/></g>\n<g id=\"local-hotel\"><path d=\"M7 13c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7h-8v-9h-2v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z\"/></g>\n<g id=\"local-laundry-service\"><path d=\"M9.17 16.83c1.56 1.56 4.1 1.56 5.66 0 1.56-1.56 1.56-4.1 0-5.66l-5.66 5.66zm8.83-14.82l-12-.01c-1.11 0-2 .89-2 2v16c0 1.11.89 2 2 2h12c1.11 0 2-.89 2-2v-16c0-1.11-.89-1.99-2-1.99zm-8 1.99c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-3 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm5 16c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z\"/></g>\n<g id=\"local-library\"><path d=\"M12 11.55c-2.36-2.2-5.52-3.55-9-3.55v11c3.48 0 6.64 1.35 9 3.55 2.36-2.19 5.52-3.55 9-3.55v-11c-3.48 0-6.64 1.35-9 3.55zm0-3.55c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z\"/></g>\n<g id=\"local-mall\"><path d=\"M19 6h-2c0-2.76-2.24-5-5-5s-5 2.24-5 5h-2c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7-3c1.66 0 3 1.34 3 3h-6c0-1.66 1.34-3 3-3zm0 10c-2.76 0-5-2.24-5-5h2c0 1.66 1.34 3 3 3s3-1.34 3-3h2c0 2.76-2.24 5-5 5z\"/></g>\n<g id=\"local-movies\"><path d=\"M18 3v2h-2v-2h-8v2h-2v-2h-2v18h2v-2h2v2h8v-2h2v2h2v-18h-2zm-10 14h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g>\n<g id=\"local-offer\"><path d=\"M21.41 11.58l-9-9c-.36-.36-.86-.58-1.41-.58h-7c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zm-15.91-4.58c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"local-parking\"><path d=\"M13 3h-7v18h4v-6h3c3.31 0 6-2.69 6-6s-2.69-6-6-6zm.2 8h-3.2v-4h3.2c1.1 0 2 .9 2 2s-.9 2-2 2z\"/></g>\n<g id=\"local-pharmacy\"><path d=\"M21 5h-2.64l1.14-3.14-2.35-.86-1.46 4h-12.69v2l2 6-2 6v2h18v-2l-2-6 2-6v-2zm-5 9h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2z\"/></g>\n<g id=\"local-phone\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1v3.49c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"/></g>\n<g id=\"local-pizza\"><path d=\"M12 2c-3.57 0-6.77 1.54-8.99 4l8.99 16 8.99-16c-2.21-2.45-5.42-4-8.99-4zm-5 5c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2zm5 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"local-play\"><path d=\"M20 12c0-1.1.9-2 2-2v-4c0-1.1-.9-2-2-2h-16c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8l-3.58-2.3-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25 1.55-3.94 1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z\"/></g>\n<g id=\"local-post-office\"><path d=\"M20 4h-16c-1.1 0-1.99.9-1.99 2l-.01 12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm0 4l-8 5-8-5v-2l8 5 8-5v2z\"/></g>\n<g id=\"local-print-shop\"><path d=\"M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11h-8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9h-12v4h12v-4z\"/></g>\n<g id=\"local-restaurant\"><path d=\"M8.1 13.34l2.83-2.83-7.02-7.01c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27l-9.76 9.76 1.41 1.41 6.89-6.87 6.88 6.88 1.41-1.41-6.88-6.88 1.47-1.47z\"/></g>\n<g id=\"local-see\"><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><path d=\"M9 2l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2h-3.17l-1.83-2h-6zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z\"/></g>\n<g id=\"local-shipping\"><path d=\"M20 8h-3v-4h-14c-1.1 0-2 .9-2 2v11h2c0 1.66 1.34 3 3 3s3-1.34 3-3h6c0 1.66 1.34 3 3 3s3-1.34 3-3h2v-5l-3-4zm-14 10.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm13.5-9l1.96 2.5h-4.46v-2.5h2.5zm-1.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"local-taxi\"><path d=\"M18.92 6.01c-.2-.59-.76-1.01-1.42-1.01h-2.5v-2h-6v2h-2.5c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"location-history\"><path d=\"M19 2h-14c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-7 3.3c1.49 0 2.7 1.21 2.7 2.7 0 1.49-1.21 2.7-2.7 2.7-1.49 0-2.7-1.21-2.7-2.7 0-1.49 1.21-2.7 2.7-2.7zm6 10.7h-12v-.9c0-2 4-3.1 6-3.1s6 1.1 6 3.1v.9z\"/></g>\n<g id=\"map\"><path d=\"M20.5 3l-.16.03-5.34 2.07-6-2.1-5.64 1.9c-.21.07-.36.25-.36.48v15.12c0 .28.22.5.5.5l.16-.03 5.34-2.07 6 2.1 5.64-1.9c.21-.07.36-.25.36-.48v-15.12c0-.28-.22-.5-.5-.5zm-5.5 16l-6-2.11v-11.89l6 2.11v11.89z\"/></g>\n<g id=\"my-location\"><path d=\"M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94v-2.06h-2v2.06c-4.17.46-7.48 3.77-7.94 7.94h-2.06v2h2.06c.46 4.17 3.77 7.48 7.94 7.94v2.06h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94h2.06v-2h-2.06zm-8.94 8c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/></g>\n<g id=\"navigation\"><path d=\"M12 2l-7.5 18.29.71.71 6.79-3 6.79 3 .71-.71z\"/></g>\n<g id=\"pin-drop\"><path d=\"M18 8c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 4.5 6 11 6 11s6-6.5 6-11zm-8 0c0-1.1.9-2 2-2s2 .9 2 2-.89 2-2 2c-1.1 0-2-.9-2-2zm-5 12v2h14v-2h-14z\"/></g>\n<g id=\"place\"><path d=\"M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/></g>\n<g id=\"rate-review\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-14 12v-2.47l6.88-6.88c.2-.2.51-.2.71 0l1.77 1.77c.2.2.2.51 0 .71l-6.89 6.87h-2.47zm12 0h-7.5l2-2h5.5v2z\"/></g>\n<g id=\"restaurant-menu\"><path d=\"M8.1 13.34l2.83-2.83-7.02-7.01c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27l-9.76 9.76 1.41 1.41 6.89-6.87 6.88 6.88 1.41-1.41-6.88-6.88 1.47-1.47z\"/></g>\n<g id=\"satellite\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-14 1.99h3c0 1.66-1.34 3.01-3 3.01v-3.01zm0 7.01v-2c2.76 0 5-2.25 5-5.01h2c0 3.87-3.13 7.01-7 7.01zm0 6l3.5-4.5 2.5 3.01 3.5-4.51 4.5 6h-14z\"/></g>\n<g id=\"store-mall-directory\"><path d=\"M20 4h-16v2h16v-2zm1 10v-2l-1-5h-16l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4h-6v-4h6v4z\"/></g>\n<g id=\"terrain\"><path d=\"M14 6l-3.75 5 2.85 3.8-1.6 1.2c-1.69-2.25-4.5-6-4.5-6l-6 8h22l-9-12z\"/></g>\n<g id=\"traffic\"><path d=\"M20 10h-3v-1.14c1.72-.45 3-2 3-3.86h-3v-1c0-.55-.45-1-1-1h-8c-.55 0-1 .45-1 1v1h-3c0 1.86 1.28 3.41 3 3.86v1.14h-3c0 1.86 1.28 3.41 3 3.86v1.14h-3c0 1.86 1.28 3.41 3 3.86v1.14c0 .55.45 1 1 1h8c.55 0 1-.45 1-1v-1.14c1.72-.45 3-2 3-3.86h-3v-1.14c1.72-.45 3-2 3-3.86zm-8 9c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2 0-1.11.89-2 2-2 1.1 0 2 .89 2 2 0 1.1-.89 2-2 2z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/notification-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"notification\" iconSize=\"24\">\n<svg><defs>\n<g id=\"adb\"><path d=\"M5 16c0 3.87 3.13 7 7 7s7-3.13 7-7v-4h-14v4zm11.12-11.63l2.1-2.1-.82-.83-2.3 2.31c-.94-.47-1.98-.75-3.1-.75s-2.16.28-3.09.75l-2.31-2.31-.82.83 2.1 2.1c-1.74 1.27-2.88 3.31-2.88 5.63v1h14v-1c0-2.32-1.14-4.36-2.88-5.63zm-7.12 4.63c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></g>\n<g id=\"bluetooth-audio\"><path d=\"M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1l-5.71-5.71h-1v7.59l-4.59-4.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 4.59-4.59v7.59h1l5.71-5.71-4.3-4.29 4.3-4.29zm-4.71-1.88l1.88 1.88-1.88 1.88v-3.76zm1.88 10.46l-1.88 1.88v-3.76l1.88 1.88z\"/></g>\n<g id=\"disc-full\"><path d=\"M20 16h2v-2h-2v2zm0-9v5h2v-5h-2zm-10-3c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm0 10c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"dnd-forwardslash\"><path d=\"M12 2c-5.5 0-10 4.5-10 10s4.5 10 10 10 10-4.5 10-10-4.5-10-10-10zm-8 10c0-4.4 3.6-8 8-8 1.8 0 3.5.6 4.9 1.7l-11.2 11.2c-1.1-1.4-1.7-3.1-1.7-4.9zm8 8c-1.8 0-3.5-.6-4.9-1.7l11.2-11.2c1.1 1.4 1.7 3.1 1.7 4.9 0 4.4-3.6 8-8 8z\"/></g>\n<g id=\"do-not-disturb\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9l11.21 11.21c-1.35 1.06-3.05 1.69-4.9 1.69zm6.31-3.1l-11.21-11.21c1.35-1.06 3.05-1.69 4.9-1.69 4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z\"/></g>\n<g id=\"drive-eta\"><path d=\"M18.92 5.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"event-available\"><path d=\"M16.53 11.06l-1.06-1.06-4.88 4.88-2.12-2.12-1.06 1.06 3.18 3.18 5.94-5.94zm2.47-8.06h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11z\"/></g>\n<g id=\"event-busy\"><path d=\"M9.31 17l2.44-2.44 2.44 2.44 1.06-1.06-2.44-2.44 2.44-2.44-1.06-1.06-2.44 2.44-2.44-2.44-1.06 1.06 2.44 2.44-2.44 2.44 1.06 1.06zm9.69-14h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11z\"/></g>\n<g id=\"event-note\"><path d=\"M17 10h-10v2h10v-2zm2-7h-1v-2h-2v2h-8v-2h-2v2h-1c-1.11 0-1.99.9-1.99 2l-.01 14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm0 16h-14v-11h14v11zm-5-5h-7v2h7v-2z\"/></g>\n<g id=\"folder-special\"><path d=\"M20 6h-8l-2-2h-6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-10c0-1.1-.9-2-2-2zm-6.42 12l-3.58-2.1-3.58 2.1.95-4.07-3.16-2.74 4.16-.36 1.63-3.83 1.63 3.84 4.16.36-3.16 2.74.95 4.06z\"/></g>\n<g id=\"mms\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-15 12l3.5-4.5 2.5 3.01 3.5-4.51 4.5 6h-14z\"/></g>\n<g id=\"more\"><path d=\"M22 3h-15c-.69 0-1.23.35-1.59.88l-5.41 8.12 5.41 8.11c.36.53.97.89 1.66.89h14.93c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-13 10.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"/></g>\n<g id=\"network-locked\"><path d=\"M19.5 10c.17 0 .33.03.5.05v-9.05l-19 19h13v-3c0-.89.39-1.68 1-2.23v-.27c0-2.48 2.02-4.5 4.5-4.5zm2.5 6v-1.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v1.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v1.5z\"/></g>\n<g id=\"phone-bluetooth-speaker\"><path d=\"M14.71 9.5l2.29-2.29v3.79h.5l2.85-2.85-2.14-2.15 2.15-2.15-2.86-2.85h-.5v3.79l-2.29-2.29-.71.71 2.79 2.79-2.79 2.79.71.71zm3.29-6.59l.94.94-.94.94v-1.88zm0 4.3l.94.94-.94.94v-1.88zm2 8.29c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z\"/></g>\n<g id=\"phone-forwarded\"><path d=\"M18 11l5-5-5-5v3h-4v4h4v3zm2 4.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z\"/></g>\n<g id=\"phone-in-talk\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-3.5h2c0-4.97-4.03-9-9-9v2c3.87 0 7 3.13 7 7zm-4 0h2c0-2.76-2.24-5-5-5v2c1.66 0 3 1.34 3 3z\"/></g>\n<g id=\"phone-locked\"><path d=\"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm0-11.5v-.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7v.5z\"/></g>\n<g id=\"phone-missed\"><path d=\"M6.5 5.5l5.5 5.5 7-7-1-1-6 6-4.5-4.5h3.5v-1.5h-6v6h1.5v-3.5zm17.21 11.17c-3.05-2.89-7.17-4.67-11.71-4.67-4.54 0-8.66 1.78-11.71 4.67-.18.18-.29.43-.29.71s.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73 1.6 0 3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.67 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71s-.12-.52-.3-.7z\"/></g>\n<g id=\"phone-paused\"><path d=\"M17 3h-2v7h2v-7zm3 12.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1-.37-1.12-.57-2.32-.57-3.57 0-.55-.45-1-1-1h-3.5c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zm-1-12.5v7h2v-7h-2z\"/></g>\n<g id=\"play-download\"><path d=\"M20 6h-4v-2l-2-2h-4l-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-10-2h4v2h-4v-2zm2 15l-5-5h3v-4h4v4h3l-5 5z\"/></g>\n<g id=\"play-install\"><path d=\"M20 6h-4v-2l-2-2h-4l-2 2v2h-4c-1.11 0-1.99.89-1.99 2l-.01 11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2v-11c0-1.11-.89-2-2-2zm-10-2h4v2h-4v-2zm.5 13.5l-3.5-3.5 1.41-1.41 2.09 2.09 5.18-5.18 1.41 1.41-6.59 6.59z\"/></g>\n<g id=\"sd-card\"><path d=\"M18 2h-8l-5.98 6-.02 12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-6 6h-2v-4h2v4zm3 0h-2v-4h2v4zm3 0h-2v-4h2v4z\"/></g>\n<g id=\"sim-card-alert\"><path d=\"M18 2h-8l-5.98 6-.02 12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-5 15h-2v-2h2v2zm0-4h-2v-5h2v5z\"/></g>\n<g id=\"sms\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-11 9h-2v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2z\"/></g>\n<g id=\"sms-failed\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></g>\n<g id=\"sync\"><path d=\"M12 4v-3l-4 4 4 4v-3c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46c.78-1.23 1.24-2.69 1.24-4.26 0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8l-1.46-1.46c-.78 1.23-1.24 2.69-1.24 4.26 0 4.42 3.58 8 8 8v3l4-4-4-4v3z\"/></g>\n<g id=\"sync-disabled\"><path d=\"M10 6.35v-2.09c-.8.21-1.55.54-2.23.96l1.46 1.46c.25-.12.5-.24.77-.33zm-7.14-.94l2.36 2.36c-.77 1.22-1.22 2.67-1.22 4.23 0 2.21.91 4.2 2.36 5.64l-2.36 2.36h6v-6l-2.24 2.24c-1.08-1.09-1.76-2.58-1.76-4.24 0-1 .25-1.94.68-2.77l8.08 8.08c-.25.13-.5.25-.77.34v2.09c.8-.21 1.55-.54 2.23-.96l2.36 2.36 1.27-1.27-15.71-15.73-1.28 1.27zm17.14-1.41h-6v6l2.24-2.24c1.08 1.09 1.76 2.58 1.76 4.24 0 1-.25 1.94-.68 2.77l1.46 1.46c.77-1.22 1.22-2.67 1.22-4.23 0-2.21-.91-4.2-2.36-5.64l2.36-2.36z\"/></g>\n<g id=\"sync-problem\"><path d=\"M3 12c0 2.21.91 4.2 2.36 5.64l-2.36 2.36h6v-6l-2.24 2.24c-1.08-1.09-1.76-2.58-1.76-4.24 0-2.61 1.67-4.83 4-5.65v-2.09c-3.45.89-6 4.01-6 7.74zm8 5h2v-2h-2v2zm10-13h-6v6l2.24-2.24c1.08 1.09 1.76 2.58 1.76 4.24 0 2.61-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74 0-2.21-.91-4.2-2.36-5.64l2.36-2.36zm-10 9h2v-6h-2v6z\"/></g>\n<g id=\"system-update\"><path d=\"M17 1.01l-10-.01c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-18c0-1.1-.9-1.99-2-1.99zm0 17.99h-10v-14h10v14zm-1-6h-3v-5h-2v5h-3l4 4 4-4z\"/></g>\n<g id=\"tap-and-play\"><path d=\"M2 16v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4v3h3c0-1.66-1.34-3-3-3zm0-8v2c4.97 0 9 4.03 9 9h2c0-6.08-4.92-11-11-11zm15-10.99l-10-.01c-1.1 0-2 .9-2 2v7.37c.69.16 1.36.37 2 .64v-6.01h10v13h-3.03c.52 1.25.84 2.59.95 4h2.08c1.1 0 2-.9 2-2v-17c0-1.1-.9-1.99-2-1.99z\"/></g>\n<g id=\"time-to-leave\"><path d=\"M18.92 5.01c-.2-.59-.76-1.01-1.42-1.01h-11c-.66 0-1.21.42-1.42 1.01l-2.08 5.99v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zm-12.42 9.99c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm-12.5-5l1.5-4.5h11l1.5 4.5h-14z\"/></g>\n<g id=\"vibration\"><path d=\"M0 15h2v-6h-2v6zm3 2h2v-10h-2v10zm19-8v6h2v-6h-2zm-3 8h2v-10h-2v10zm-2.5-14h-9c-.83 0-1.5.67-1.5 1.5v15c0 .83.67 1.5 1.5 1.5h9c.83 0 1.5-.67 1.5-1.5v-15c0-.83-.67-1.5-1.5-1.5zm-.5 16h-8v-14h8v14z\"/></g>\n<g id=\"voice-chat\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 18 4-4h14c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-2 12l-4-3.2v3.2h-8v-8h8v3.2l4-3.2v8z\"/></g>\n<g id=\"vpn-lock\"><path d=\"M22 4v-.5c0-1.38-1.12-2.5-2.5-2.5s-2.5 1.12-2.5 2.5v.5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7v.5zm-2.28 8c.04.33.08.66.08 1 0 2.08-.8 3.97-2.1 5.39-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1h-6v-2h2c.55 0 1-.45 1-1v-2h2c1.1 0 2-.9 2-2v-2.54c-.95-.3-1.95-.46-3-.46-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10c0-.34-.02-.67-.05-1h-2.03zm-8.92 8.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79l4.79 4.79v1c0 1.1.9 2 2 2v1.93z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/png-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<core-iconset id=\"core-icons\" src=\"../core-action-icons/action-icons.png\" width=\"24\" iconSize=\"24\"\n    icons=\"drawer menu search dropdown close add trash refresh settings dialoga \n           left right down up grid contact account plus time marker \n           briefcase array columns list modules quilt stream maximize shrink sort \n           shortcut dialog twitter facebook favorite gplus filter tag plusone dots\">\n\n  <property theme=\"core-light-theme\" offsetX=\"24\"></property>\n  <property theme=\"core-dark-theme\" offsetX=\"72\"></property>\n</core-iconset>\n"
  },
  {
    "path": "src/mui/bower_components/core-icons/social-icons.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"../core-iconset-svg/core-iconset-svg.html\">\n<core-iconset-svg id=\"social\" iconSize=\"24\">\n<svg><defs>\n<g id=\"cake\"><path d=\"M12 7c1.1 0 2-.9 2-2 0-.38-.1-.73-.29-1.03l-1.71-2.97-1.71 2.97c-.19.3-.29.65-.29 1.03 0 1.1.9 2 2 2zm9 14v-4c0-1.1-.9-2-2-2h-1v-3c0-1.1-.9-2-2-2h-3v-2h-2v2h-3c-1.1 0-2 .9-2 2v3h-1c-1.1 0-2 .9-2 2v4h-2v2h22v-2h-2z\"/></g>\n<g id=\"circles\"><path d=\"M16.66 14.98c-.82 2.34-3.04 4.02-5.66 4.02-3.31 0-6-2.69-6-6 0-2.62 1.68-4.84 4.02-5.66l-.02-.34c0-1.01.2-1.98.54-2.87-4.27.7-7.54 4.4-7.54 8.87 0 4.97 4.03 9 9 9 4.47 0 8.17-3.27 8.87-7.54-.89.34-1.86.54-2.87.54l-.34-.02zm.34-13.98c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 9c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z\"/></g>\n<g id=\"circles-add\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M13 11v-3h-2v3h-3v2h3v3h2v-3h3v-2h-3z\"/></g>\n<g id=\"circles-extended\"><path d=\"M12 10c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0-6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm-6 9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm6-7.9c-1.05 0-1.9.85-1.9 1.9s.85 1.9 1.9 1.9c1.05 0 1.9-.85 1.9-1.9s-.85-1.9-1.9-1.9zm6 1.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z\"/></g>\n<g id=\"communities\"><path d=\"M9 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm5-3c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-7c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/></g>\n<g id=\"domain\"><path d=\"M12 7v-4h-10v18h20v-14h-10zm-6 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm4 12h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2v-2h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z\"/></g>\n<g id=\"group\"><path d=\"M16 11c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5v2.5h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45v2.5h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"/></g>\n<g id=\"group-add\"><path d=\"M8 10h-3v-3h-2v3h-3v2h3v3h2v-3h3v-2zm10 1c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-.32 0-.63.05-.91.14.57.81.9 1.79.9 2.86s-.34 2.04-.9 2.86c.28.09.59.14.91.14zm-5 0c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm6.62 2.16c.83.73 1.38 1.66 1.38 2.84v2h3v-2c0-1.54-2.37-2.49-4.38-2.84zm-6.62-.16c-2 0-6 1-6 3v2h12v-2c0-2-4-3-6-3z\"/></g>\n<g id=\"location-city\"><path d=\"M15 11v-6l-3-3-3 3v2h-6v14h18v-10h-6zm-8 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm6 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2v-2h2v2zm6 12h-2v-2h2v2zm0-4h-2v-2h2v2z\"/></g>\n<g id=\"mood\"><path d=\"M11.99 2c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5h-10.22c.8 2.04 2.78 3.5 5.11 3.5z\"/></g>\n<g id=\"notifications\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-6v-5.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2z\"/></g>\n<g id=\"notifications-none\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-6v-5.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2zm-2 1h-9v-6.5c0-2.49 2.01-4.5 4.5-4.5s4.5 2.01 4.5 4.5v6.5z\"/></g>\n<g id=\"notifications-off\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-11.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.51.12-.99.32-1.45.56l9.45 9.44v-3.68zm-.27 8.5l2 2 1.27-1.27-16.73-16.73-1.27 1.27 2.92 2.92c-.58.97-.92 2.1-.92 3.31v5.5l-2 2v1h14.73z\"/></g>\n<g id=\"notifications-on\"><path d=\"M6.58 3.58l-1.43-1.43c-2.39 1.82-3.97 4.65-4.12 7.85h2c.15-2.65 1.51-4.97 3.55-6.42zm13.39 6.42h2c-.15-3.2-1.73-6.03-4.13-7.85l-1.43 1.43c2.05 1.45 3.41 3.77 3.56 6.42zm-1.97.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2v-5.5zm-6.5 11.5c.14 0 .27-.01.4-.04.65-.13 1.19-.58 1.44-1.18.1-.24.16-.5.16-.78h-4c0 1.1.9 2 2 2z\"/></g>\n<g id=\"notifications-paused\"><path d=\"M11.5 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6.5-6v-5.5c0-3.07-2.13-5.64-5-6.32v-.68c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-2.87.68-5 3.25-5 6.32v5.5l-2 2v1h17v-1l-2-2zm-4-6.2l-2.8 3.4h2.8v1.8h-5v-1.8l2.8-3.4h-2.8v-1.8h5v1.8z\"/></g>\n<g id=\"pages\"><path d=\"M3 5v6h5l-1-4 4 1v-5h-6c-1.1 0-2 .9-2 2zm5 8h-5v6c0 1.1.9 2 2 2h6v-5l-4 1 1-4zm9 4l-4-1v5h6c1.1 0 2-.9 2-2v-6h-5l1 4zm2-14h-6v5l4-1-1 4h5v-6c0-1.1-.9-2-2-2z\"/></g>\n<g id=\"party-mode\"><path d=\"M20 4h-3.17l-1.83-2h-6l-1.83 2h-3.17c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-12c0-1.1-.9-2-2-2zm-8 3c1.63 0 3.06.79 3.98 2h-3.98c-1.66 0-3 1.34-3 3 0 .35.07.69.18 1h-2.08c-.06-.32-.1-.66-.1-1 0-2.76 2.24-5 5-5zm0 10c-1.63 0-3.06-.79-3.98-2h3.98c1.66 0 3-1.34 3-3 0-.35-.07-.69-.18-1h2.08c.07.32.1.66.1 1 0 2.76-2.24 5-5 5z\"/></g>\n<g id=\"people\"><path d=\"M16 11c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3s-1.33-3-2.99-3c-1.66 0-3 1.34-3 3s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5v2.5h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45v2.5h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"/></g>\n<g id=\"people-outline\"><path d=\"M16.5 13c-1.2 0-3.07.34-4.5 1-1.43-.67-3.3-1-4.5-1-2.17 0-6.5 1.08-6.5 3.25v2.75h22v-2.75c0-2.17-4.33-3.25-6.5-3.25zm-4 4.5h-10v-1.25c0-.54 2.56-1.75 5-1.75s5 1.21 5 1.75v1.25zm9 0h-7.5v-1.25c0-.46-.2-.86-.52-1.22.88-.3 1.96-.53 3.02-.53 2.44 0 5 1.21 5 1.75v1.25zm-14-5.5c1.93 0 3.5-1.57 3.5-3.5s-1.57-3.5-3.5-3.5-3.5 1.57-3.5 3.5 1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 5.5c1.93 0 3.5-1.57 3.5-3.5s-1.57-3.5-3.5-3.5-3.5 1.57-3.5 3.5 1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z\"/></g>\n<g id=\"person\"><path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"person-add\"><path d=\"M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2v-3h-2v3h-3v2h3v3h2v-3h3v-2h-3zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"person-outline\"><path d=\"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1-2.1-.94-2.1-2.1.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1h-12.2v-1.1c0-.64 3.13-2.1 6.1-2.1m0-10.9c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z\"/></g>\n<g id=\"plus-one\"><path d=\"M10 8h-2v4h-4v2h4v4h2v-4h4v-2h-4zm4.5-1.92v1.82l2.5-.5v10.6h2v-13z\"/></g>\n<g id=\"poll\"><path d=\"M19 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2zm-10 14h-2v-7h2v7zm4 0h-2v-10h2v10zm4 0h-2v-4h2v4z\"/></g>\n<g id=\"post-blogger\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-4 7v1c0 .55.45 1 1 1s1 .45 1 1v3c0 1.66-1.34 3-3 3h-6c-1.66 0-3-1.34-3-3v-7c0-1.66 1.34-3 3-3h4c1.66 0 3 1.34 3 3v1zm-6.05 1h2.6c.55 0 1-.45 1-1s-.45-1-1-1h-2.6c-.55 0-1 .45-1 1s.45 1 1 1zm4.05 3h-4.05c-.55 0-1 .45-1 1s.45 1 1 1h4.05c.55 0 1-.45 1-1s-.45-1-1-1z\"/></g>\n<g id=\"post-facebook\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-1 2v3h-2c-.55 0-1 .45-1 1v2h3v3h-3v7h-3v-7h-2v-3h2v-2.5c0-1.93 1.57-3.5 3.5-3.5h2.5z\"/></g>\n+<g id=\"post-github\"><path d=\"M7.2 6.6h-.1c-.5 1.4-.2 2.3-.1 2.6-.6.7-1 1.6-1 2.6 0 3.8 2.4 4.6 4.6 4.9-.2 0-.6.2-.8.8-.4.2-1.8.7-2.6-.7 0 0-.5-.8-1.3-.9 0 0-.8 0-.1.5 0 0 .6.3.9 1.3 0 0 .5 1.7 3 1.1v3.1h5v-3.5c0-1-.4-1.5-.8-1.8 2.2-.2 4.6-1 4.6-4.8 0-1.1-.4-2-1-2.6.1-.3.4-1.2-.1-2.6 0 0-.8-.3-2.7 1-.8-.2-1.6-.3-2.5-.3-.8 0-1.7.1-2.5.3-1.4-1-2.2-1-2.6-1zm12.8 15.4h-16c-1.1 0-2-.9-2-2v-16c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2v16c0 1.1-.9 2-2 2z\"/></g>\n<g id=\"post-gplus\"><path d=\"M11.2 8.87c0-1.02-.63-3.02-2.08-3.02-.64 0-1.32.44-1.32 1.67 0 1.18.63 2.93 1.97 2.93.06.01 1.43-.01 1.43-1.58zm-.63 4.94l-.31-.01h-.02c-.26 0-1.15.05-1.82.27-.65.24-1.42.72-1.42 1.7 0 1.08 1.04 2.23 2.96 2.23 1.52 0 2.44-1 2.44-1.97 0-.77-.46-1.24-1.83-2.22zm9.43-11.81h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-10.93 17.2c-2.8 0-4.07-1.56-4.07-3.01 0-.45.14-1.59 1.48-2.39.77-.47 1.85-.78 3.14-.91-.19-.25-.34-.55-.34-.99 0-.16.02-.31.05-.46h-.38c-1.97 0-3.15-1.55-3.15-3.04 0-1.73 1.29-3.6 4.11-3.6h4.21l-.34.34-.71.71-.06.06h-.71c.41.42.9 1.12.9 2.16 0 1.4-.74 2.09-1.56 2.73-.16.12-.42.38-.42.72 0 .3.24.5.39.62.13.11.3.22.47.34.81.57 1.92 1.34 1.92 2.88 0 1.77-1.29 3.84-4.93 3.84zm9.93-7.2h-2v2h-1v-2h-2v-1h2v-2h1v2h2v1z\"/></g>\n<g id=\"post-instagram\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-8 6c2.21 0 4 1.79 4 4s-1.79 4-4 4-4-1.79-4-4 1.79-4 4-4zm-7.5 12c-.28 0-.5-.22-.5-.5v-8.5h2.09c-.05.33-.09.66-.09 1 0 3.31 2.69 6 6 6s6-2.69 6-6c0-.34-.04-.67-.09-1h2.09v8.5c0 .28-.22.5-.5.5h-15zm15.5-13.5c0 .28-.22.5-.5.5h-2c-.28 0-.5-.22-.5-.5v-2c0-.28.22-.5.5-.5h2c.28 0 .5.22.5.5v2z\"/></g>\n<g id=\"post-linkedin\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-12 17h-3v-9h3v9zm-1.5-10.69c-1 0-1.81-.81-1.81-1.81s.81-1.81 1.81-1.81 1.81.81 1.81 1.81-.81 1.81-1.81 1.81zm12.5 10.69h-3v-5.3c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v5.3h-3v-9h3v1.2c.52-.84 1.59-1.4 2.5-1.4 1.93 0 3.5 1.57 3.5 3.5v5.7z\"/></g>\n<g id=\"post-pinterest\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-7 14.2c-.8 0-1.57-.34-2.12-.92l-.95 3.2-.07.21-.03-.01c-.19.32-.54.52-.93.52-.61 0-1.1-.49-1.1-1.1l.01-.15h-.01l.05-.18 1.85-5.56s-.2-.61-.2-1.47c0-1.72.92-2.23 1.66-2.23.74 0 1.42.27 1.42 1.31 0 1.34-.89 2.03-.89 3 0 .74.6 1.34 1.34 1.34 2.33 0 3.16-1.76 3.16-3.41 0-2.18-1.88-3.95-4.2-3.95-2.32 0-4.2 1.77-4.2 3.95 0 .67.19 1.34.54 1.94.09.16.14.33.14.51 0 .55-.45 1-1 1-.36 0-.69-.19-.87-.5-.53-.9-.82-1.92-.82-2.96.02-3.27 2.8-5.94 6.22-5.94s6.2 2.67 6.2 5.95c0 2.63-1.63 5.45-5.2 5.45z\"/></g>\n<g id=\"post-tumblr\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-4 9h-3v3.9c0 .73.14 1.1 1.1 1.1h1.9v3s-1.03.1-2.1.1c-2.65 0-3.9-1.62-3.9-3.4v-4.7h-2v-2.8c2.41-.2 2.62-2.04 2.8-3.2h2.2v3h3v3z\"/></g>\n<g id=\"post-twitter\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-2.29 7.33c-.06 4.62-3.02 7.78-7.42 7.98-1.82.08-3.14-.5-4.28-1.23 1.34.21 3.01-.32 3.9-1.09-1.32-.13-2.1-.8-2.46-1.88.38.07.78.05 1.14-.03-1.19-.4-2.04-1.13-2.08-2.67.33.15.68.29 1.14.32-.9-.5-1.55-2.35-.8-3.57 1.32 1.45 2.91 2.63 5.52 2.79-.65-2.8 3.06-4.32 4.61-2.44.66-.13 1.19-.38 1.7-.65-.21.65-.62 1.1-1.12 1.47.54-.07 1.03-.21 1.44-.41-.25.53-.81 1.01-1.29 1.41z\"/></g>\n<g id=\"post-youtube\"><path d=\"M20 2h-16c-1.1 0-1.99.9-1.99 2l-.01 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-16c0-1.1-.9-2-2-2zm-1.49 15.5c-.45.15-3.73.5-6.51.5-2.77 0-6.05-.35-6.5-.5-1.17-.39-1.5-2.8-1.5-5.5s.33-5.11 1.5-5.5c.45-.15 3.73-.5 6.5-.5 2.78 0 6.06.36 6.51.51 1.17.39 1.49 2.79 1.49 5.49s-.32 5.11-1.49 5.5zm-8.51-2l5.5-3.5-5.5-3.5v7z\"/></g>\n<g id=\"public\"><path d=\"M12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10 10-4.48 10-10-4.48-10-10-10zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79l4.79 4.79v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1h-6v-2h2c.55 0 1-.45 1-1v-2h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\"/></g>\n<g id=\"school\"><path d=\"M5 13.18v4l7 3.82 7-3.82v-4l-7 3.82-7-3.82zm7-10.18l-11 6 11 6 9-4.91v6.91h2v-8l-11-6z\"/></g>\n<g id=\"share\"><path d=\"M18 16.08c-.76 0-1.44.3-1.96.77l-7.13-4.15c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7l-7.05 4.11c-.54-.5-1.25-.81-2.04-.81-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z\"/></g>\n<g id=\"whatshot\"><path d=\"M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36c-2.02 2.4-3.23 5.51-3.23 8.89 0 4.42 3.58 8 8 8s8-3.58 8-8c0-5.39-2.59-10.2-6.5-13.33zm-1.79 18.33c-1.78 0-3.22-1.4-3.22-3.14 0-1.62 1.05-2.76 2.81-3.12 1.77-.36 3.6-1.21 4.62-2.58.39 1.29.59 2.65.59 4.04 0 2.65-2.15 4.8-4.8 4.8z\"/></g>\n</defs></svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset/.bower.json",
    "content": "{\n  \"name\": \"core-iconset\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\",\n    \"core-meta\": \"Polymer/core-meta#^0.5.0\",\n    \"core-icon\": \"Polymer/core-icon#^0.5.0\"\n  },\n  \"version\": \"0.5.2\",\n  \"homepage\": \"https://github.com/Polymer/core-iconset\",\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"fabcd6967770984f460930ec1059b950b4126828\"\n  },\n  \"_source\": \"git://github.com/Polymer/core-iconset.git\",\n  \"_target\": \"^0.5.0\",\n  \"_originalSource\": \"Polymer/core-iconset\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-iconset/README.md",
    "content": "core-iconset\n============\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-iconset) for more information.\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset/bower.json",
    "content": "{\n  \"name\": \"core-iconset\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\",\n    \"core-meta\": \"Polymer/core-meta#^0.5.0\",\n    \"core-icon\": \"Polymer/core-icon#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-iconset/core-iconset.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<!--\n/**\n * @group Polymer Core Elements\n *\n * The `core-iconset` element allows users to define their own icon sets. \n * The `src` property specifies the url of the icon image. Multiple icons may\n * be included in this image and they may be organized into rows.\n * The `icons` property is a space separated list of names corresponding to the\n * icons. The names must be ordered as the icons are ordered in the icon image.\n * Icons are expected to be square and are the size specified by the `iconSize`\n * property. The `width` property corresponds to the width of the icon image \n * and must be specified if icons are arranged into multiple rows in the image.\n *\n * All `core-iconset` elements are available for use by other `core-iconset`\n * elements via a database keyed by id. Typically, an element author that wants\n * to support a set of custom icons uses a `core-iconset` to retrieve \n * and use another, user-defined iconset.\n *\n * Example:\n *\n *     <core-iconset id=\"my-icons\" src=\"my-icons.png\" width=\"96\" iconSize=\"24\"\n *         icons=\"location place starta stopb bus car train walk\">\n *     </core-iconset>\n *\n * This will automatically register the icon set \"my-icons\" to the iconset\n * database.  To use these icons from within another element, make a \n * `core-iconset` element and call the `byId` method to retrieve a\n * given iconset. To apply a particular icon to an element, use the \n * `applyIcon` method. For example:\n *\n *     iconset.applyIcon(iconNode, 'car');\n *\n * Themed icon sets are also supported. The `core-iconset` can contain child\n * `property` elements that specify a theme with an offsetX and offsetY of the\n * theme within the icon resource. For example.\n *\n *     <core-iconset id=\"my-icons\" src=\"my-icons.png\" width=\"96\" iconSize=\"24\"\n *         icons=\"location place starta stopb bus car train walk\">\n *       <property theme=\"special\" offsetX=\"256\" offsetY=\"24\"></property>\n *     </core-iconset>\n *\n * Then a themed icon can be applied like this:\n *\n *     iconset.applyIcon(iconNode, 'car', 'special');\n *\n * @element core-iconset\n * @extends core-meta\n * @homepage github.io\n */\n-->\n\n<link rel=\"import\" href=\"../core-meta/core-meta.html\">\n\n<polymer-element name=\"core-iconset\" extends=\"core-meta\" attributes=\"src width icons iconSize\">\n  \n  <script>\n  \n    Polymer('core-iconset', {\n  \n      /**\n       * The URL of the iconset image.\n       *\n       * @attribute src\n       * @type string\n       * @default ''\n       */\n      src: '',\n\n      /**\n       * The width of the iconset image. This must only be specified if the\n       * icons are arranged into separate rows inside the image.\n       *\n       * @attribute width\n       * @type number\n       * @default 0\n       */\n      width: 0,\n\n      /**\n       * A space separated list of names corresponding to icons in the iconset\n       * image file. This list must be ordered the same as the icon images\n       * in the image file.\n       *\n       * @attribute icons\n       * @type string\n       * @default ''\n       */\n      icons: '',\n\n      /**\n       * The size of an individual icon. Note that icons must be square.\n       *\n       * @attribute iconSize\n       * @type number\n       * @default 24\n       */\n      iconSize: 24,\n\n      /**\n       * The horizontal offset of the icon images in the inconset src image.\n       * This is typically used if the image resource contains additional images\n       * beside those intended for the iconset.\n       *\n       * @attribute offsetX\n       * @type number\n       * @default 0\n       */\n      offsetX: 0,\n      /**\n       * The vertical offset of the icon images in the inconset src image.\n       * This is typically used if the image resource contains additional images\n       * beside those intended for the iconset.\n       *\n       * @attribute offsetY\n       * @type number\n       * @default 0\n       */\n      offsetY: 0,\n      type: 'iconset',\n\n      created: function() {\n        this.iconMap = {};\n        this.iconNames = [];\n        this.themes = {};\n      },\n  \n      ready: function() {\n        // TODO(sorvell): ensure iconset's src is always relative to the main\n        // document\n        if (this.src && (this.ownerDocument !== document)) {\n          this.src = this.resolvePath(this.src, this.ownerDocument.baseURI);\n        }\n        this.super();\n        this.updateThemes();\n      },\n\n      iconsChanged: function() {\n        var ox = this.offsetX;\n        var oy = this.offsetY;\n        this.icons && this.icons.split(/\\s+/g).forEach(function(name, i) {\n          this.iconNames.push(name);\n          this.iconMap[name] = {\n            offsetX: ox,\n            offsetY: oy\n          }\n          if (ox + this.iconSize < this.width) {\n            ox += this.iconSize;\n          } else {\n            ox = this.offsetX;\n            oy += this.iconSize;\n          }\n        }, this);\n      },\n\n      updateThemes: function() {\n        var ts = this.querySelectorAll('property[theme]');\n        ts && ts.array().forEach(function(t) {\n          this.themes[t.getAttribute('theme')] = {\n            offsetX: parseInt(t.getAttribute('offsetX')) || 0,\n            offsetY: parseInt(t.getAttribute('offsetY')) || 0\n          };\n        }, this);\n      },\n\n      // TODO(ffu): support retrived by index e.g. getOffset(10);\n      /**\n       * Returns an object containing `offsetX` and `offsetY` properties which\n       * specify the pixel locaion in the iconset's src file for the given\n       * `icon` and `theme`. It's uncommon to call this method. It is useful,\n       * for example, to manually position a css backgroundImage to the proper\n       * offset. It's more common to use the `applyIcon` method.\n       *\n       * @method getOffset\n       * @param {String|Number} icon The name of the icon or the index of the\n       * icon within in the icon image.\n       * @param {String} theme The name of the theme.\n       * @returns {Object} An object specifying the offset of the given icon \n       * within the icon resource file; `offsetX` is the horizontal offset and\n       * `offsetY` is the vertical offset. Both values are in pixel units.\n       */\n      getOffset: function(icon, theme) {\n        var i = this.iconMap[icon];\n        if (!i) {\n          var n = this.iconNames[Number(icon)];\n          i = this.iconMap[n];\n        }\n        var t = this.themes[theme];\n        if (i && t) {\n          return {\n            offsetX: i.offsetX + t.offsetX,\n            offsetY: i.offsetY + t.offsetY\n          }\n        }\n        return i;\n      },\n\n      /**\n       * Applies an icon to the given element as a css background image. This\n       * method does not size the element, and it's often necessary to set \n       * the element's height and width so that the background image is visible.\n       *\n       * @method applyIcon\n       * @param {Element} element The element to which the background is\n       * applied.\n       * @param {String|Number} icon The name or index of the icon to apply.\n       * @param {Number} scale (optional, defaults to 1) A scaling factor \n       * with which the icon can be magnified.\n       * @return {Element} The icon element.\n       */\n      applyIcon: function(element, icon, scale) {\n        var offset = this.getOffset(icon);\n        scale = scale || 1;\n        if (element && offset) {\n          var icon = element._icon || document.createElement('div');\n          var style = icon.style;\n          style.backgroundImage = 'url(' + this.src + ')';\n          style.backgroundPosition = (-offset.offsetX * scale + 'px') + \n             ' ' + (-offset.offsetY * scale + 'px');\n          style.backgroundSize = scale === 1 ? 'auto' :\n             this.width * scale + 'px';\n          if (icon.parentNode !== element) {\n            element.appendChild(icon);\n          }\n          return icon;\n        }\n      }\n\n    });\n\n  </script>\n\n</polymer-element>\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<html>\n<head>\n\n  <title>core-iconset</title>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"core-iconset.html\">\n  <link rel=\"import\" href=\"../core-icon/core-icon.html\">\n\n</head>\n<body unresolved>\n  \n  <!-- Register an icon set; you can do this anywhere, including an HTMLImport! -->\n  <core-iconset id=\"my-icons\" src=\"my-icons.png\" width=\"96\" iconSize=\"24\"\n      icons=\"location place starta stopb bus car train walk\">\n  </core-iconset>\n\n  <core-iconset id=\"my-icons-big\" src=\"my-icons-big.png\" width=\"192\" iconSize=\"48\"\n      icons=\"location place starta stopb bus car train walk\">\n  </core-iconset>\n\n  <!-- Now create a bunch of icons using our iconset -->\n  <core-icon icon=\"my-icons:location\"></core-icon>\n  <core-icon icon=\"my-icons:place\"></core-icon>\n  <core-icon icon=\"my-icons:starta\"></core-icon>\n  <core-icon icon=\"my-icons:stopb\"></core-icon>\n  <core-icon icon=\"my-icons:bus\"></core-icon>\n  <core-icon icon=\"my-icons:car\"></core-icon>\n  <core-icon icon=\"my-icons:train\"></core-icon>\n  <core-icon icon=\"my-icons:walk\"></core-icon>\n  <br>\n  <!-- icons may also be specified by index -->\n  <style>\n    .embiggen core-icon {\n      width: 48px;\n      height: 48px;\n    }\n  </style>\n\n  <div class=\"embiggen\">\n    <core-icon icon=\"my-icons-big:0\"></core-icon>\n    <core-icon icon=\"my-icons-big:1\"></core-icon>\n    <core-icon icon=\"my-icons-big:2\"></core-icon>\n    <core-icon icon=\"my-icons-big:3\"></core-icon>\n    <core-icon icon=\"my-icons-big:4\"></core-icon>\n    <core-icon icon=\"my-icons-big:5\"></core-icon>\n    <core-icon icon=\"my-icons-big:6\"></core-icon>\n    <core-icon icon=\"my-icons-big:7\"></core-icon>\n  </div>\n\n </body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset-svg/.bower.json",
    "content": "{\n  \"name\": \"core-iconset-svg\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\",\n    \"core-iconset\": \"Polymer/core-iconset#^0.5.0\"\n  },\n  \"version\": \"0.5.2\",\n  \"homepage\": \"https://github.com/Polymer/core-iconset-svg\",\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"998ef1ee71f358cd0e95e6085945c0182d86c224\"\n  },\n  \"_source\": \"git://github.com/Polymer/core-iconset-svg.git\",\n  \"_target\": \"^0.5.0\",\n  \"_originalSource\": \"Polymer/core-iconset-svg\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-iconset-svg/README.md",
    "content": "core-iconset-svg\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-iconset-svg) for more information.\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset-svg/bower.json",
    "content": "{\n  \"name\": \"core-iconset-svg\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\",\n    \"core-iconset\": \"Polymer/core-iconset#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-iconset-svg/core-iconset-svg.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<!--\n/**\n * @group Polymer Core Elements\n *\n * The `core-iconset-svg` element allows users to define their own icon sets\n * that contain svg icons. The svg icon elements should be children of the\n * `core-iconset-svg` element. Multiple icons should be given distinct id's.\n *\n * Using svg elements to create icons has a few advantages over traditional\n * bitmap graphics like jpg or png. Icons that use svg are vector based so they\n * are resolution independent and should look good on any device. They are\n * stylable via css. Icons can be themed, colorized, and even animated.\n *\n * Example:\n *\n *     <core-iconset-svg id=\"my-svg-icons\" iconSize=\"24\">\n *       <svg>\n *         <defs>\n *           <g id=\"shape\">\n *             <rect x=\"50\" y=\"50\" width=\"50\" height=\"50\" />\n *             <circle cx=\"50\" cy=\"50\" r=\"50\" />\n *           </g>\n *         </defs>\n *       </svg>\n *     </core-iconset-svg>\n *\n * This will automatically register the icon set \"my-svg-icons\" to the iconset\n * database.  To use these icons from within another element, make a\n * `core-iconset` element and call the `byId` method\n * to retrieve a given iconset. To apply a particular icon inside an\n * element use the `applyIcon` method. For example:\n *\n *     iconset.applyIcon(iconNode, 'car');\n *\n * @element core-iconset-svg\n * @extends core-meta\n * @homepage github.io\n */\n-->\n\n<link rel=\"import\" href=\"../core-iconset/core-iconset.html\">\n\n<polymer-element name=\"core-iconset-svg\" extends=\"core-meta\" attributes=\"iconSize\">\n\n  <script>\n\n    Polymer('core-iconset-svg', {\n\n\n      /**\n       * The size of an individual icon. Note that icons must be square.\n       *\n       * @attribute iconSize\n       * @type number\n       * @default 24\n       */\n      iconSize: 24,\n      type: 'iconset',\n\n      created: function() {\n        this._icons = {};\n      },\n\n      ready: function() {\n        this.super();\n        this.updateIcons();\n      },\n\n      iconById: function(id) {\n        return this._icons[id] || (this._icons[id] = this.querySelector('[id=\"' + id +'\"]'));\n      },\n\n      cloneIcon: function(id) {\n        var icon = this.iconById(id);\n        if (icon) {\n          var content = icon.cloneNode(true);\n          content.removeAttribute('id');\n          var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n          svg.setAttribute('viewBox', '0 0 ' + this.iconSize + ' ' +\n              this.iconSize);\n          // NOTE(dfreedm): work around https://crbug.com/370136\n          svg.style.pointerEvents = 'none';\n          svg.appendChild(content);\n          return svg;\n        }\n      },\n\n      get iconNames() {\n        if (!this._iconNames) {\n          this._iconNames = this.findIconNames();\n        }\n        return this._iconNames;\n      },\n\n      findIconNames: function() {\n        var icons = this.querySelectorAll('[id]').array();\n        if (icons.length) {\n          return icons.map(function(n){ return n.id });\n        }\n      },\n\n      /**\n       * Applies an icon to the given element. The svg icon is added to the\n       * element's shadowRoot if one exists or directly to itself.\n       *\n       * @method applyIcon\n       * @param {Element} element The element to which the icon is\n       * applied.\n       * @param {String|Number} icon The name the icon to apply.\n       * @return {Element} The icon element\n       */\n      applyIcon: function(element, icon) {\n        var root = element;\n        // remove old\n        var old = root.querySelector('svg');\n        if (old) {\n          old.remove();\n        }\n        // install new\n        var svg = this.cloneIcon(icon);\n        if (!svg) {\n          return;\n        }\n        svg.setAttribute('height', '100%');\n        svg.setAttribute('width', '100%');\n        svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n        svg.style.display = 'block';\n        root.insertBefore(svg, root.firstElementChild);\n        return svg;\n      },\n      \n      /**\n       * Tell users of the iconset, that the set has loaded.\n       * This finds all elements matching the selector argument and calls \n       * the method argument on them.\n       * @method updateIcons\n       * @param selector {string} css selector to identify iconset users, \n       * defaults to '[icon]'\n       * @param method {string} method to call on found elements, \n       * defaults to 'updateIcon'\n       */\n      updateIcons: function(selector, method) {\n        selector = selector || '[icon]';\n        method = method || 'updateIcon';\n        var deep = window.ShadowDOMPolyfill ? '' : 'html /deep/ ';\n        var i$ = document.querySelectorAll(deep + selector);\n        for (var i=0, e; e=i$[i]; i++) {\n          if (e[method]) {\n            e[method].call(e);\n          }\n        }\n      }\n      \n\n    });\n\n  </script>\n\n</polymer-element>\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset-svg/demo.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<html>\n<head>\n\n  <title>core-iconset-svg</title>\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"svg-sample-icons.html\">\n  <style shim-shadowdom>\n    .embiggen core-icon {\n      height: 128px;\n      width: 128px;\n    }\n\n    core-icon:nth-of-type(1) {\n      fill: orange;\n    }\n\n    core-icon:nth-of-type(2) {\n      fill: green;\n      stroke: orange;\n    }\n\n    core-icon:nth-of-type(3) {\n      fill: navy;\n    }\n\n    core-icon {\n      transition: all 0.5s;\n      -webkit-transition: all 0.5s;\n    }\n\n    core-icon:hover {\n      -webkit-filter: drop-shadow( 2px 2px 2px #333 );\n      filter: drop-shadow( 2px 2px 2px #333 );\n    }\n  </style>\n</head>\n<body unresolved>\n\n  <template is=\"auto-binding\">\n    <div class=\"embiggen\">\n      <template repeat=\"{{icon in icons}}\">\n        <core-icon icon=\"{{icon}}\"></core-icon>\n      </template>\n    </div>\n    <core-meta id=\"meta\" type=\"iconset\"></core-meta>\n  </template>\n  <script>\n    addEventListener('template-bound', function(e) {\n      var template = e.target;\n      var setName = 'svg-sample-icons';\n      var icons = template.$.meta.byId(setName).iconNames;\n      template.icons = icons.map(function(ic){ return setName + ':' +ic });\n    });\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset-svg/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-iconset-svg/svg-sample-icons.html",
    "content": "\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"../core-icon/core-icon.html\">\n<link rel=\"import\" href=\"core-iconset-svg.html\">\n\n<core-iconset-svg id=\"svg-sample-icons\" iconSize=\"100\">\n  <svg>\n    <defs> \n    <g id=\"codepen\"> \n      <path class=\"outer-ring\"  d=\"M50,0C22.385,0,0,22.385,0,50c0,27.615,22.385,50,50,50c27.614,0,50-22.385,50-50C100,22.385,77.615,0,50,0z M50,91.789\n      C26.958,91.789,8.212,73.042,8.212,50C8.212,26.958,26.958,8.212,50,8.212c23.042,0,41.788,18.747,41.788,41.789\n      C91.788,73.042,73.042,91.789,50,91.789z\"></path>\n      <path class=\"inner-logo\"  d=\"M80.893,40.234c-0.006-0.039-0.016-0.076-0.022-0.115c-0.013-0.075-0.027-0.15-0.046-0.223\n      c-0.012-0.044-0.028-0.086-0.042-0.128c-0.021-0.065-0.042-0.13-0.068-0.193c-0.018-0.044-0.039-0.088-0.059-0.13\n      c-0.028-0.06-0.057-0.119-0.09-0.175c-0.024-0.042-0.051-0.083-0.076-0.124c-0.036-0.055-0.073-0.109-0.112-0.161\n      c-0.029-0.039-0.06-0.078-0.091-0.115c-0.042-0.049-0.086-0.098-0.132-0.143c-0.035-0.036-0.069-0.072-0.106-0.104\n      c-0.049-0.044-0.099-0.086-0.15-0.127c-0.04-0.031-0.079-0.062-0.12-0.091c-0.016-0.01-0.029-0.023-0.044-0.033L51.474,19.531\n      c-0.893-0.595-2.055-0.595-2.947,0L20.267,38.371c-0.015,0.01-0.028,0.023-0.044,0.033c-0.042,0.029-0.081,0.06-0.12,0.091\n      c-0.052,0.041-0.102,0.083-0.15,0.127c-0.037,0.032-0.071,0.068-0.106,0.104c-0.046,0.045-0.09,0.094-0.132,0.143\n      c-0.031,0.038-0.062,0.077-0.092,0.115c-0.039,0.052-0.076,0.106-0.111,0.161c-0.027,0.041-0.052,0.082-0.076,0.124\n      c-0.033,0.057-0.062,0.115-0.09,0.175c-0.021,0.042-0.042,0.086-0.06,0.13c-0.026,0.063-0.047,0.128-0.068,0.193\n      c-0.014,0.042-0.029,0.084-0.042,0.128c-0.02,0.073-0.032,0.148-0.046,0.223c-0.006,0.039-0.016,0.076-0.021,0.115\n      c-0.016,0.114-0.024,0.229-0.024,0.346V59.42c0,0.117,0.009,0.233,0.024,0.348c0.005,0.038,0.015,0.077,0.021,0.114\n      c0.014,0.075,0.027,0.149,0.046,0.223c0.012,0.043,0.028,0.086,0.042,0.128c0.021,0.065,0.042,0.13,0.068,0.195\n      c0.018,0.044,0.039,0.086,0.06,0.129c0.028,0.06,0.058,0.118,0.09,0.177c0.024,0.041,0.049,0.082,0.076,0.122\n      c0.035,0.056,0.072,0.109,0.111,0.161c0.029,0.041,0.061,0.078,0.092,0.115c0.042,0.049,0.086,0.098,0.132,0.144\n      c0.035,0.036,0.069,0.071,0.106,0.104c0.048,0.044,0.099,0.086,0.15,0.127c0.039,0.031,0.078,0.062,0.12,0.091\n      c0.016,0.01,0.029,0.023,0.044,0.032l28.259,18.84c0.446,0.297,0.96,0.447,1.474,0.447c0.513,0,1.027-0.149,1.473-0.447\n      l28.259-18.84c0.015-0.009,0.028-0.022,0.044-0.032c0.042-0.029,0.081-0.06,0.12-0.091c0.051-0.041,0.102-0.083,0.15-0.127\n      c0.037-0.033,0.071-0.068,0.106-0.104c0.046-0.046,0.09-0.095,0.132-0.144c0.031-0.037,0.062-0.075,0.091-0.115\n      c0.04-0.052,0.076-0.105,0.112-0.161c0.025-0.041,0.051-0.081,0.076-0.122c0.033-0.059,0.062-0.117,0.09-0.177\n      c0.02-0.042,0.041-0.085,0.059-0.129c0.026-0.065,0.047-0.13,0.068-0.195c0.014-0.042,0.03-0.085,0.042-0.128\n      c0.02-0.074,0.033-0.148,0.046-0.223c0.006-0.037,0.016-0.076,0.022-0.114c0.014-0.115,0.023-0.231,0.023-0.348V40.581\n      C80.916,40.464,80.907,40.348,80.893,40.234z M52.657,26.707l20.817,13.877l-9.298,6.221l-11.519-7.706V26.707z M47.343,26.707\n      v12.393l-11.518,7.706l-9.299-6.221L47.343,26.707z M24.398,45.554L31.046,50l-6.648,4.446V45.554z M47.343,73.294L26.525,59.417\n      l9.299-6.219l11.518,7.704V73.294z M50,56.286L40.603,50L50,43.715L59.397,50L50,56.286z M52.657,73.294V60.902l11.519-7.704\n      l9.298,6.219L52.657,73.294z M75.602,54.447L68.955,50l6.647-4.446V54.447z\"></path> \n    </g>\n    \n    <path id=\"twitter\" d=\"M100.001,17.942c-3.681,1.688-7.633,2.826-11.783,3.339\n    c4.236-2.624,7.49-6.779,9.021-11.73c-3.965,2.432-8.354,4.193-13.026,5.146C80.47,10.575,75.138,8,69.234,8\n    c-11.33,0-20.518,9.494-20.518,21.205c0,1.662,0.183,3.281,0.533,4.833c-17.052-0.884-32.168-9.326-42.288-22.155\n    c-1.767,3.133-2.778,6.773-2.778,10.659c0,7.357,3.622,13.849,9.127,17.65c-3.363-0.109-6.525-1.064-9.293-2.651\n    c-0.002,0.089-0.002,0.178-0.002,0.268c0,10.272,7.072,18.845,16.458,20.793c-1.721,0.484-3.534,0.744-5.405,0.744\n    c-1.322,0-2.606-0.134-3.859-0.379c2.609,8.424,10.187,14.555,19.166,14.726c-7.021,5.688-15.867,9.077-25.48,9.077\n    c-1.656,0-3.289-0.102-4.895-0.297C9.08,88.491,19.865,92,31.449,92c37.737,0,58.374-32.312,58.374-60.336\n    c0-0.92-0.02-1.834-0.059-2.743C93.771,25.929,97.251,22.195,100.001,17.942L100.001,17.942z\"></path>\n\n    <g id=\"youtube\">\n      <path class=\"youtube\"  d=\"M98.77,27.492c-1.225-5.064-5.576-8.799-10.811-9.354C75.561,16.818,63.01,15.993,50.514,16\n      c-12.495-0.007-25.045,0.816-37.446,2.139c-5.235,0.557-9.583,4.289-10.806,9.354C0.522,34.704,0.5,42.574,0.5,50.001\n      c0,7.426,0,15.296,1.741,22.509c1.224,5.061,5.572,8.799,10.807,9.352c12.399,1.32,24.949,2.145,37.446,2.14\n      c12.494,0.005,25.047-0.817,37.443-2.14c5.234-0.555,9.586-4.291,10.81-9.352c1.741-7.213,1.753-15.083,1.753-22.509\n      S100.51,34.704,98.77,27.492 M67.549,52.203L43.977,64.391c-2.344,1.213-4.262,0.119-4.262-2.428V38.036\n      c0-2.548,1.917-3.644,4.262-2.429l23.572,12.188C69.896,49.008,69.896,50.992,67.549,52.203\"></path>\n    </g> \n    \n    </defs>\n  </svg>\n</core-iconset-svg>\n"
  },
  {
    "path": "src/mui/bower_components/core-meta/.bower.json",
    "content": "{\n  \"name\": \"core-meta\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\",\n  \"homepage\": \"https://github.com/Polymer/core-meta\",\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"d16e6c42ed1a4a2b3ada1d978859c85bdcedb79f\"\n  },\n  \"_source\": \"git://github.com/Polymer/core-meta.git\",\n  \"_target\": \"^0.5.0\",\n  \"_originalSource\": \"Polymer/core-meta\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-meta/README.md",
    "content": "core-meta\n=========\n\nSee the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-meta) for more information.\n"
  },
  {
    "path": "src/mui/bower_components/core-meta/bower.json",
    "content": "{\n  \"name\": \"core-meta\",\n  \"private\": true,\n  \"dependencies\": {\n    \"polymer\": \"Polymer/polymer#^0.5.0\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "src/mui/bower_components/core-meta/core-meta.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<!--\n`core-meta` provides a method of constructing a self-organizing database.\nIt is useful to collate element meta-data for things like catalogs and for \ndesigner.\n\nExample, an element folder has a `metadata.html` file in it, that contains a \n`core-meta`, something like this:\n\n    <core-meta id=\"my-element\" label=\"My Element\">\n      <property name=\"color\" value=\"blue\"></property>\n    </core-meta>\n\nAn application can import as many of these files as it wants, and then use \n`core-meta` again to access the collected data.\n\n    <script>\n      var meta = document.createElement('core-meta');\n      console.log(meta.list); // dump a list of all meta-data elements that have been created\n    </script>\n\nUse `byId(id)` to retrive a specific core-meta.\n\n    <script>\n      var meta = document.createElement('core-meta');\n      console.log(meta.byId('my-element'));\n    </script>\n\nBy default all meta-data are stored in a single databse.  If your meta-data \nhave different types and want them to be stored separately, use `type` to \ndifferentiate them.\n\nExample:\n\n    <core-meta id=\"x-foo\" type=\"xElt\"></core-meta>\n    <core-meta id=\"x-bar\" type=\"xElt\"></core-meta>\n    <core-meta id=\"y-bar\" type=\"yElt\"></core-meta>\n\n    <script>\n      var meta = document.createElement('core-meta');\n      meta.type = 'xElt';\n      console.log(meta.list);\n    </script>\n\n@group Polymer Core Elements\n@element core-meta\n@homepage github.io\n-->\n\n<link rel=\"import\" href=\"../polymer/polymer.html\">\n\n<polymer-element name=\"core-meta\" attributes=\"label type\" hidden>\n<script>\n\n  (function() {\n    \n    var SKIP_ID = 'meta';\n    var metaData = {}, metaArray = {};\n\n    Polymer('core-meta', {\n      \n      /**\n       * The type of meta-data.  All meta-data with the same type with be\n       * stored together.\n       * \n       * @attribute type\n       * @type string\n       * @default 'default'\n       */\n      type: 'default',\n      \n      alwaysPrepare: true,\n      \n      ready: function() {\n        this.register(this.id);\n      },\n      \n      get metaArray() {\n        var t = this.type;\n        if (!metaArray[t]) {\n          metaArray[t] = [];\n        }\n        return metaArray[t];\n      },\n      \n      get metaData() {\n        var t = this.type;\n        if (!metaData[t]) {\n          metaData[t] = {};\n        }\n        return metaData[t];\n      },\n      \n      register: function(id, old) {\n        if (id && id !== SKIP_ID) {\n          this.unregister(this, old);\n          this.metaData[id] = this;\n          this.metaArray.push(this);\n        }\n      },\n      \n      unregister: function(meta, id) {\n        delete this.metaData[id || meta.id];\n        var i = this.metaArray.indexOf(meta);\n        if (i >= 0) {\n          this.metaArray.splice(i, 1);\n        }\n      },\n      \n      /**\n       * Returns a list of all meta-data elements with the same type.\n       * \n       * @property list\n       * @type array\n       * @default []\n       */\n      get list() {\n        return this.metaArray;\n      },\n      \n      /**\n       * Retrieves meta-data by ID.\n       *\n       * @method byId\n       * @param {String} id The ID of the meta-data to be returned.\n       * @returns Returns meta-data.\n       */\n      byId: function(id) {\n        return this.metaData[id];\n      }\n      \n    });\n    \n  })();\n  \n</script>\n</polymer-element>\n"
  },
  {
    "path": "src/mui/bower_components/core-meta/demo.html",
    "content": "<!DOCTYPE html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n<html>\n<head>\n  <title>core-meta</title>\n  \n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"core-meta.html\">\n</head>\n\n<body>\n\n  <core-meta id=\"x-foo\" label=\"foo\"></core-meta>\n  <core-meta id=\"x-bar\" label=\"bar\"></core-meta>\n  <core-meta id=\"x-zot\" label=\"zot\"></core-meta>\n  \n  <core-meta id=\"apple\" label=\"apple\" type=\"fruit\"></core-meta>\n  <core-meta id=\"orange\" label=\"orange\" type=\"fruit\"></core-meta>\n  <core-meta id=\"grape\" label=\"grape\" type=\"fruit\"></core-meta>\n  \n  <h2>meta-data</h2>\n  \n  <template id=\"default\" repeat=\"{{metadata}}\">\n    <div>{{label}}</div>\n  </template>\n  \n  <h2>meta-data (type: fruit)</h2>\n  \n  <template id=\"fruit\" repeat=\"{{metadata}}\">\n    <div>{{label}}</div>\n  </template>\n  \n  <script>\n  \n    document.addEventListener('polymer-ready', function() {\n      var meta = document.createElement('core-meta');\n      document.querySelector('template#default').model = {\n        metadata: meta.list\n      };\n      \n      var fruitMeta = document.createElement('core-meta');\n      fruitMeta.type = 'fruit';\n      document.querySelector('template#fruit').model = {\n        metadata: fruitMeta.list\n      };\n    });\n    \n  </script>\n  \n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/core-meta/index.html",
    "content": "<!doctype html>\n<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS\n-->\n<html>\n<head>\n\n  <script src=\"../webcomponentsjs/webcomponents.js\"></script>\n  <link rel=\"import\" href=\"../core-component-page/core-component-page.html\">\n\n</head>\n<body unresolved>\n\n  <core-component-page></core-component-page>\n\n</body>\n</html>\n"
  },
  {
    "path": "src/mui/bower_components/polymer/.bower.json",
    "content": "{\n  \"name\": \"polymer\",\n  \"description\": \"Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.\",\n  \"homepage\": \"http://www.polymer-project.org/\",\n  \"keywords\": [\n    \"util\",\n    \"client\",\n    \"browser\",\n    \"web components\",\n    \"web-components\"\n  ],\n  \"author\": \"Polymer Authors <polymer-dev@googlegroups.com>\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-component-page\": \"Polymer/core-component-page#^0.5.0\",\n    \"webcomponentsjs\": \"Polymer/webcomponentsjs#^0.5.0\"\n  },\n  \"devDependencies\": {\n    \"tools\": \"Polymer/tools#master\",\n    \"web-component-tester\": \"Polymer/web-component-tester#^1.4.2\"\n  },\n  \"version\": \"0.5.2\",\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"2a9ca53fa79ca09907e818f1adf806765409ec9c\"\n  },\n  \"_source\": \"git://github.com/Polymer/polymer.git\",\n  \"_target\": \"~0.5.1\",\n  \"_originalSource\": \"Polymer/polymer\"\n}"
  },
  {
    "path": "src/mui/bower_components/polymer/README.md",
    "content": "# Polymer\n\n[![Polymer build status](http://www.polymer-project.org/build/polymer-dev/status.png \"Polymer build status\")](http://build.chromium.org/p/client.polymer/waterfall)\n\n## Brief Overview\n\nFor more detailed info goto [http://polymer-project.org/](http://polymer-project.org/).\n\nPolymer is a new type of library for the web, designed to leverage the existing browser infrastructure to provide the encapsulation and extendability currently only available in JS libraries.\n\nPolymer is based on a set of future technologies, including [Shadow DOM](http://w3c.github.io/webcomponents/spec/shadow/), [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/) and Model Driven Views. Currently these technologies are implemented as polyfills or shims, but as browsers adopt these features natively, the platform code that drives Polymer evacipates, leaving only the value-adds.\n\n## Tools & Testing\n\nFor running tests or building minified files, consult the [tooling information](https://www.polymer-project.org/resources/tooling-strategy.html).\n\n## Releases\n\n[Release (tagged) versions](https://github.com/Polymer/polymer/releases) of Polymer include concatenated and minified sources for your convenience.\n\n[![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/polymer/README)](https://github.com/igrigorik/ga-beacon)\n"
  },
  {
    "path": "src/mui/bower_components/polymer/bower.json",
    "content": "{\n  \"name\": \"polymer\",\n  \"description\": \"Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.\",\n  \"homepage\": \"http://www.polymer-project.org/\",\n  \"keywords\": [\n    \"util\",\n    \"client\",\n    \"browser\",\n    \"web components\",\n    \"web-components\"\n  ],\n  \"author\": \"Polymer Authors <polymer-dev@googlegroups.com>\",\n  \"private\": true,\n  \"dependencies\": {\n    \"core-component-page\": \"Polymer/core-component-page#^0.5.0\",\n    \"webcomponentsjs\": \"Polymer/webcomponentsjs#^0.5.0\"\n  },\n  \"devDependencies\": {\n    \"tools\": \"Polymer/tools#master\",\n    \"web-component-tester\": \"Polymer/web-component-tester#^1.4.2\"\n  },\n  \"version\": \"0.5.2\"\n}"
  },
  {
    "path": "src/mui/bower_components/polymer/build.log",
    "content": "BUILD LOG\n---------\nBuild Time: 2014-12-11T12:46:30\n\nNODEJS INFORMATION\n==================\nnodejs: v0.10.33\ngrunt: 0.4.5\ngrunt-audit: 1.0.0\ngrunt-contrib-concat: 0.5.0\ngrunt-contrib-copy: 0.7.0\ngrunt-contrib-uglify: 0.6.0\ngrunt-string-replace: 1.0.0\n\nREPO REVISIONS\n==============\npolymer-expressions: 197c3a0150e7a13374cfcc72e7066113723a623d\npolymer-gestures: 17a6304916521be39409af292e8adf899bae0ce7\npolymer: a74e9f36526361dccb6df91be439ff9c3e043f41\n\nBUILD HASHES\n============\ndist/polymer.js: b9ad4c86af79c748cf4ea722f6d56671079fadf7\ndist/polymer.min.js: 2f2021ba9682b0bb702ee7fb68fb6fbfd288eac2\ndist/layout.html: 348d358a91712ecc2f8811efa430fcd954b4590c"
  },
  {
    "path": "src/mui/bower_components/polymer/dist/polymer.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"layout.html\">\n\n<script src=\"polymer.js\"></script>\n"
  },
  {
    "path": "src/mui/bower_components/polymer/layout.html",
    "content": "<!--\r\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\nCode distributed by Google as part of the polymer project is also\r\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n-->\r\n<style shim-shadowdom>\r\n/*******************************\r\n          Flex Layout\r\n*******************************/\r\n\r\nhtml /deep/ [layout][horizontal], html /deep/ [layout][vertical] {\r\n  display: -ms-flexbox;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n}\r\n\r\nhtml /deep/ [layout][horizontal][inline], html /deep/ [layout][vertical][inline] {\r\n  display: -ms-inline-flexbox;\r\n  display: -webkit-inline-flex;\r\n  display: inline-flex;\r\n}\r\n\r\nhtml /deep/ [layout][horizontal] {\r\n  -ms-flex-direction: row;\r\n  -webkit-flex-direction: row;\r\n  flex-direction: row;\r\n}\r\n\r\nhtml /deep/ [layout][horizontal][reverse] {\r\n  -ms-flex-direction: row-reverse;\r\n  -webkit-flex-direction: row-reverse;\r\n  flex-direction: row-reverse;\r\n}\r\n\r\nhtml /deep/ [layout][vertical] {\r\n  -ms-flex-direction: column;\r\n  -webkit-flex-direction: column;\r\n  flex-direction: column;\r\n}\r\n\r\nhtml /deep/ [layout][vertical][reverse] {\r\n  -ms-flex-direction: column-reverse;\r\n  -webkit-flex-direction: column-reverse;\r\n  flex-direction: column-reverse;\r\n}\r\n\r\nhtml /deep/ [layout][wrap] {\r\n  -ms-flex-wrap: wrap;\r\n  -webkit-flex-wrap: wrap;\r\n  flex-wrap: wrap;\r\n}\r\n\r\nhtml /deep/ [layout][wrap-reverse] {\r\n  -ms-flex-wrap: wrap-reverse;\r\n  -webkit-flex-wrap: wrap-reverse;\r\n  flex-wrap: wrap-reverse;\r\n}\r\n\r\nhtml /deep/ [flex] {\r\n  -ms-flex: 1 1 0.000000001px;\r\n  -webkit-flex: 1;\r\n  flex: 1;\r\n  -webkit-flex-basis: 0.000000001px;\r\n  flex-basis: 0.000000001px;\r\n}\r\n\r\nhtml /deep/ [vertical][layout] > [flex][auto-vertical], html /deep/ [vertical][layout]::shadow [flex][auto-vertical] {\r\n  -ms-flex: 1 1 auto;\r\n  -webkit-flex-basis: auto;\r\n  flex-basis: auto;\r\n}\r\n\r\nhtml /deep/ [flex][auto] {\r\n  -ms-flex: 1 1 auto;\r\n  -webkit-flex-basis: auto;\r\n  flex-basis: auto;\r\n}\r\n\r\nhtml /deep/ [flex][none] {\r\n  -ms-flex: none;\r\n  -webkit-flex: none;\r\n  flex: none;\r\n}\r\n\r\nhtml /deep/ [flex][one] {\r\n  -ms-flex: 1;\r\n  -webkit-flex: 1;\r\n  flex: 1;\r\n}\r\n\r\nhtml /deep/ [flex][two] {\r\n  -ms-flex: 2;\r\n  -webkit-flex: 2;\r\n  flex: 2;\r\n}\r\n\r\nhtml /deep/ [flex][three] {\r\n  -ms-flex: 3;\r\n  -webkit-flex: 3;\r\n  flex: 3;\r\n}\r\n\r\nhtml /deep/ [flex][four] {\r\n  -ms-flex: 4;\r\n  -webkit-flex: 4;\r\n  flex: 4;\r\n}\r\n\r\nhtml /deep/ [flex][five] {\r\n  -ms-flex: 5;\r\n  -webkit-flex: 5;\r\n  flex: 5;\r\n}\r\n\r\nhtml /deep/ [flex][six] {\r\n  -ms-flex: 6;\r\n  -webkit-flex: 6;\r\n  flex: 6;\r\n}\r\n\r\nhtml /deep/ [flex][seven] {\r\n  -ms-flex: 7;\r\n  -webkit-flex: 7;\r\n  flex: 7;\r\n}\r\n\r\nhtml /deep/ [flex][eight] {\r\n  -ms-flex: 8;\r\n  -webkit-flex: 8;\r\n  flex: 8;\r\n}\r\n\r\nhtml /deep/ [flex][nine] {\r\n  -ms-flex: 9;\r\n  -webkit-flex: 9;\r\n  flex: 9;\r\n}\r\n\r\nhtml /deep/ [flex][ten] {\r\n  -ms-flex: 10;\r\n  -webkit-flex: 10;\r\n  flex: 10;\r\n}\r\n\r\nhtml /deep/ [flex][eleven] {\r\n  -ms-flex: 11;\r\n  -webkit-flex: 11;\r\n  flex: 11;\r\n}\r\n\r\nhtml /deep/ [flex][twelve] {\r\n  -ms-flex: 12;\r\n  -webkit-flex: 12;\r\n  flex: 12;\r\n}\r\n\r\n/* alignment in cross axis */\r\n\r\nhtml /deep/ [layout][start] {\r\n  -ms-flex-align: start;\r\n  -webkit-align-items: flex-start;\r\n  align-items: flex-start;\r\n}\r\n\r\nhtml /deep/ [layout][center], html /deep/ [layout][center-center] {\r\n  -ms-flex-align: center;\r\n  -webkit-align-items: center;\r\n  align-items: center;\r\n}\r\n\r\nhtml /deep/ [layout][end] {\r\n  -ms-flex-align: end;\r\n  -webkit-align-items: flex-end;\r\n  align-items: flex-end;\r\n}\r\n\r\n/* alignment in main axis */\r\n\r\nhtml /deep/ [layout][start-justified] {\r\n  -ms-flex-pack: start;\r\n  -webkit-justify-content: flex-start;\r\n  justify-content: flex-start;\r\n}\r\n\r\nhtml /deep/ [layout][center-justified], html /deep/ [layout][center-center] {\r\n  -ms-flex-pack: center;\r\n  -webkit-justify-content: center;\r\n  justify-content: center;\r\n}\r\n\r\nhtml /deep/ [layout][end-justified] {\r\n  -ms-flex-pack: end;\r\n  -webkit-justify-content: flex-end;\r\n  justify-content: flex-end;\r\n}\r\n\r\nhtml /deep/ [layout][around-justified] {\r\n  -ms-flex-pack: distribute;\r\n  -webkit-justify-content: space-around;\r\n  justify-content: space-around;\r\n}\r\n\r\nhtml /deep/ [layout][justified] {\r\n  -ms-flex-pack: justify;\r\n  -webkit-justify-content: space-between;\r\n  justify-content: space-between;\r\n}\r\n\r\n/* self alignment */\r\n\r\nhtml /deep/ [self-start] {\r\n  -ms-align-self: flex-start;\r\n  -webkit-align-self: flex-start;\r\n  align-self: flex-start;\r\n}\r\n\r\nhtml /deep/ [self-center] {\r\n  -ms-align-self: center;\r\n  -webkit-align-self: center;\r\n  align-self: center;\r\n}\r\n\r\nhtml /deep/ [self-end] {\r\n  -ms-align-self: flex-end;\r\n  -webkit-align-self: flex-end;\r\n  align-self: flex-end;\r\n}\r\n\r\nhtml /deep/ [self-stretch] {\r\n  -ms-align-self: stretch;\r\n  -webkit-align-self: stretch;\r\n  align-self: stretch;\r\n}\r\n\r\n/*******************************\r\n          Other Layout\r\n*******************************/\r\n\r\nhtml /deep/ [block] {\r\n  display: block;\r\n}\r\n\r\n/* ie support for hidden */\r\nhtml /deep/ [hidden] {\r\n  display: none !important;\r\n}\r\n\r\nhtml /deep/ [relative] {\r\n  position: relative;\r\n}\r\n\r\nhtml /deep/ [fit] {\r\n  position: absolute;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n}\r\n\r\nbody[fullbleed] {\r\n  margin: 0;\r\n  height: 100vh;\r\n}\r\n\r\n/*******************************\r\n            Other\r\n*******************************/\r\n\r\nhtml /deep/ [segment], html /deep/ segment {\r\n  display: block;\r\n  position: relative;\r\n  -webkit-box-sizing: border-box;\r\n  -ms-box-sizing: border-box;\r\n  box-sizing: border-box;\r\n  margin: 1em 0.5em;\r\n  padding: 1em;\r\n  background-color: white;\r\n  -webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);\r\n  box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1);\r\n  border-radius: 5px 5px 5px 5px;\r\n}\r\n\r\n</style>"
  },
  {
    "path": "src/mui/bower_components/polymer/polymer.html",
    "content": "<!--\nCopyright (c) 2014 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n-->\n\n<link rel=\"import\" href=\"layout.html\">\n\n<script src=\"polymer.js\"></script>\n"
  },
  {
    "path": "src/mui/bower_components/polymer/polymer.js",
    "content": "/**\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 */\n// @version 0.5.1\nwindow.PolymerGestures = {};\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    },\n    path: function(event) {\n      var p;\n      if (HAS_FULL_PATH && event.path && event.path.length) {\n        p = event.path;\n      } else {\n        p = [];\n        var n = this.findTarget(event);\n        while (n) {\n          p.push(n);\n          n = n.parentNode || n.host;\n        }\n      }\n      return p;\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n\n(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 * 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 * 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(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    IS_IOS: false,\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    addGestureDependency: function(node, currentGestures) {\n      var gesturesWanted = node._pgEvents;\n      if (gesturesWanted && currentGestures) {\n        var gk = Object.keys(gesturesWanted);\n        for (var i = 0, r, ri, g; i < gk.length; i++) {\n          // gesture\n          g = gk[i];\n          if (gesturesWanted[g] > 0) {\n            // lookup gesture recognizer\n            r = this.dependencyMap[g];\n            // recognizer index\n            ri = r ? r.index : -1;\n            currentGestures[ri] = true;\n          }\n        }\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n\n        // in IOS mode, there is only a listener on the document, so this is not re-entrant\n        if (this.IS_IOS) {\n          var ev = inEvent;\n          if (type === 'touchstart') {\n            var ct = inEvent.changedTouches[0];\n            // set up a fake event to give to the path builder\n            ev = {target: inEvent.target, clientX: ct.clientX, clientY: ct.clientY, path: inEvent.path};\n          }\n          // use event path if available, otherwise build a path from target finding\n          var nodes = inEvent.path || scope.targetFinding.path(ev);\n          for (var i = 0, n; i < nodes.length; i++) {\n            n = nodes[i];\n            this.addGestureDependency(n, currentGestures);\n          }\n        } else {\n          this.addGestureDependency(inEvent.currentTarget, currentGestures);\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        if (rg) {\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      }\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(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 CURRENT_BUTTONS = 0;\n\n  var FIREFOX_LINUX = /Linux.*Firefox\\//i;\n\n  var HAS_BUTTONS = (function() {\n    // firefox on linux returns spec-incorrect values for mouseup.buttons\n    // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent.buttons#See_also\n    // https://codereview.chromium.org/727593003/#msg16\n    if (FIREFOX_LINUX.test(navigator.userAgent)) {\n      return false;\n    }\n    try {\n      return new MouseEvent('test', {buttons: 1}).buttons === 1;\n    } catch (e) {\n      return false;\n    }\n  })();\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        var type = inEvent.type;\n        var bit = WHICH_TO_BUTTONS[inEvent.which] || 0;\n        if (type === 'mousedown') {\n          CURRENT_BUTTONS |= bit;\n        } else if (type === 'mouseup') {\n          CURRENT_BUTTONS &= ~bit;\n        }\n        e.buttons = CURRENT_BUTTONS;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\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 ((HAS_BUTTONS ? e.buttons : e.which) === 0) {\n            if (!HAS_BUTTONS) {\n              CURRENT_BUTTONS = e.buttons = 0;\n            }\n            dispatcher.cancel(e);\n            this.cleanupMouse(e.buttons);\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(e.buttons);\n      }\n    },\n    cleanupMouse: function(buttons) {\n      if (buttons === 0) {\n        pointermap.delete(this.POINTER_ID);\n      }\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\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 DEDUP_DIST = 25;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    IS_IOS: false,\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (this.IS_IOS ? initial : !initial) {\n        dispatcher.listen(target, this.events);\n      }\n    },\n    unregister: function(target) {\n      if (!this.IS_IOS) {\n        dispatcher.unlisten(target, this.events);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.firstTarget = inTouch.target;\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        }, this);\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      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  // prevent \"ghost clicks\" that come from elements that were removed in a touch handler\n  var STOP_PROP_FN = Event.prototype.stopImmediatePropagation || Event.prototype.stopPropagation;\n  document.addEventListener('click', function(ev) {\n    var x = ev.clientX, y = ev.clientY;\n    // check if a click is within DEDUP_DIST px radius of the touchstart\n    var closeTo = function(touch) {\n      var dx = Math.abs(x - touch.x), dy = Math.abs(y - touch.y);\n      return (dx <= DEDUP_DIST && dy <= DEDUP_DIST);\n    };\n    // if click coordinates are close to touch coordinates, assume the click came from a touch\n    var wasTouched = scope.mouseEvents.lastTouches.some(closeTo);\n    // if the click came from touch, and the touchstart target is not in the path of the click event,\n    // then the touchstart target was probably removed, and the click should be \"busted\"\n    var path = scope.targetFinding.path(ev);\n    if (wasTouched) {\n      for (var i = 0; i < path.length; i++) {\n        if (path[i] === touchEvents.firstTarget) {\n          return;\n        }\n      }\n      ev.preventDefault();\n      STOP_PROP_FN.call(ev);\n    }\n  }, true);\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  // Work around iOS bugs https://bugs.webkit.org/show_bug.cgi?id=135628 and https://bugs.webkit.org/show_bug.cgi?id=136506\n  var ua = navigator.userAgent;\n  var IS_IOS = ua.match(/iPad|iPhone|iPod/) && 'ontouchstart' in window;\n\n  dispatcher.IS_IOS = IS_IOS;\n  scope.touchEvents.IS_IOS = IS_IOS;\n\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n\n/**\n * 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 * 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 * 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      var tap = true;\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        tap = (e.buttons ^ 1) && (downState.buttons & 1);\n      }\n      return tap && !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 * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module pointer-gestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module pointer-gestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'down',\n      'up',\n      'move',\n      'cancel'\n    ],\n    exposes: [\n      'pinchstart',\n      'pinch',\n      'pinchend',\n      'rotate'\n    ],\n    defaultActions: {\n      'pinch': 'none',\n      'rotate': 'none'\n    },\n    reference: {},\n    down: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.targetFinding.LCA(points.a.target, points.b.target)\n        };\n\n        this.firePinch('pinchstart', points.diameter, points);\n      }\n    },\n    up: function(inEvent) {\n      var p = pointermap.get(inEvent.pointerId);\n      var num = pointermap.pointers();\n      if (p) {\n        if (num === 2) {\n          // fire 'pinchend' before deleting pointer\n          var points = this.calcChord();\n          this.firePinch('pinchend', points.diameter, points);\n        }\n        pointermap.delete(inEvent.pointerId);\n      }\n    },\n    move: function(inEvent) {\n      if (pointermap.has(inEvent.pointerId)) {\n        pointermap.set(inEvent.pointerId, inEvent);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    cancel: function(inEvent) {\n        this.up(inEvent);\n    },\n    firePinch: function(type, diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var e = eventFactory.makeGestureEvent(type, {\n        bubbles: true,\n        cancelable: true,\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y,\n        _source: 'pinch'\n      });\n      this.reference.target.dispatchEvent(e);\n    },\n    fireRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var e = eventFactory.makeGestureEvent('rotate', {\n        bubbles: true,\n        cancelable: true,\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y,\n        _source: 'pinch'\n      });\n      this.reference.target.dispatchEvent(e);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.firePinch('pinch', diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.fireRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      // start with at least two pointers\n      var points = {a: pointers[0], b: pointers[1]};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    }\n  };\n  dispatcher.registerGesture('pinch', pinch);\n})(window.PolymerGestures);\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\nPolymer = {\n  version: '0.5.1'\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(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\tBuild only script.\n\n  Ensures scripts needed for basic x-platform compatibility\n  will be run when platform.js is not loaded.\n */\nif (!window.WebComponents) {\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.WebComponents) {\n\n  WebComponents = {\n  \tflush: function() {},\n    flags: {log: {}}\n  };\n\n  Platform = WebComponents;\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/*\n  Create polyfill scope and feature detect native support.\n*/\nwindow.HTMLImports = window.HTMLImports || {flags:{}};\n\n(function(scope) {\n\n/**\n  Basic setup and simple module executer. We collect modules and then execute\n  the code later, only if it's necessary for polyfilling.\n*/\nvar IMPORT_LINK_TYPE = 'import';\nvar useNative = Boolean(IMPORT_LINK_TYPE in document.createElement('link'));\n\n/**\n  Support `currentScript` on all browsers as `document._currentScript.`\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.\n*/\n// NOTE: ShadowDOMPolyfill intrusion.\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\nvar wrap = function(node) {\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n};\nvar rootDocument = wrap(document);\n\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(rootDocument, '_currentScript', currentScriptDescriptor);\n\n/**\n  Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`\n  method. This api is necessary because unlike the native implementation,\n  script elements do not force imports to resolve. Instead, users should wrap\n  code in either an `HTMLImportsLoaded` hander or after load time in an\n  `HTMLImports.whenReady(callback)` call.\n\n  NOTE: This module also supports these apis under the native implementation.\n  Therefore, if this file is loaded, the same code can be used under both\n  the polyfill and native implementation.\n */\n\nvar isIE = /Trident/.test(navigator.userAgent);\n\n// call a callback when all HTMLImports in the document at call time\n// (or at least document ready) 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 whenReady(callback, doc) {\n  doc = doc || rootDocument;\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\nfunction markTargetLoaded(event) {\n  event.target.__loaded = true;\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) && callback) {\n       callback();\n    }\n  }\n  function loadedImport(e) {\n    markTargetLoaded(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, {target: 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).\n// However, we cannot rely on this entirely without watching the entire document\n// for import links. For perf reasons, currently only head is watched.\n// Instead, we fallback to checking if the import property is available\n// and the document is not itself loading.\nfunction isImportLoaded(link) {\n  return useNative ? link.__loaded ||\n      (link.import && link.import.readyState !== 'loading') :\n      link.__importParsed;\n}\n\n// TODO(sorvell): Workaround for\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\n// this bug is addressed.\n// (1) Install a mutation observer to see when HTMLImports have loaded\n// (2) if this script is run during document load it will watch any existing\n// imports for loading.\n//\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\n// with imports that are added to document.head since the mutation observer\n// watches only head for perf reasons, (2) it requires this script\n// to run before any imports have completed loading.\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  // make sure to catch any imports that are in the process of loading\n  // when this script is run.\n  (function() {\n    if (document.readyState === 'loading') {\n      var imports = document.querySelectorAll('link[rel=import]');\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\n        handleImport(imp);\n      }\n    }\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.\nwhenReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  rootDocument.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n// exports\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.useNative = useNative;\nscope.rootDocument = rootDocument;\nscope.whenReady = whenReady;\nscope.isIE = isIE;\n\n})(HTMLImports);\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n\n/*\n\tBuild only script.\n\n  Ensures scripts needed for basic x-platform compatibility\n  will be run when platform.js is not loaded.\n */\n}\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0 && s !== '';\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[i]);\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    return function(fn) {\n      return Promise.resolve().then(fn);\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      objects: objects,\n      get rootObject() { return rootObj; },\n      set rootObject(value) {\n        rootObj = value;\n        rootObjProps = {};\n      },\n      open: function(obs, object) {\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        if (lastObservedSet === this)\n          lastObservedSet = null;\n      },\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.rootObject !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.rootObject = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  // Export the observe-js object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, export as a global object.\n\n  var expose = global;\n\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      expose = exports = module.exports;\n    }\n    expose = exports;\n  } \n\n  expose.Observer = Observer;\n  expose.Observer.runEOM_ = runEOM;\n  expose.Observer.observerSentinel_ = observerSentinel; // for testing.\n  expose.Observer.hasObjectObserve = hasObserve;\n  expose.ArrayObserver = ArrayObserver;\n  expose.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  expose.ArraySplice = ArraySplice;\n  expose.ObjectObserver = ObjectObserver;\n  expose.PathObserver = PathObserver;\n  expose.CompoundObserver = CompoundObserver;\n  expose.Path = Path;\n  expose.ObserverTransform = ObserverTransform;\n  \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(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    },\n\n    get origin() {\n      var host;\n      if (this._isInvalid || !this._scheme) {\n        return '';\n      }\n      // javascript: Gecko returns String(\"\"), WebKit/Blink String(\"null\")\n      // Gecko throws error for \"data://\"\n      // data: Gecko returns \"\", Blink returns \"data://\", WebKit returns \"null\"\n      // Gecko returns String(\"\") for file: mailto:\n      // WebKit/Blink returns String(\"SCHEME://\") for file: mailto:\n      switch (this._scheme) {\n        case 'data':\n        case 'file':\n        case 'javascript':\n        case 'mailto':\n          return 'null';\n      }\n      host = this.host;\n      if (!host) {\n        return '';\n      }\n      return this._scheme + '://' + host;\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n\n(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\nscope.endOfMicrotask = endOfMicrotask;\n// bc \nPlatform.endOfMicrotask = endOfMicrotask;\n\n})(Polymer);\n\n\n(function(scope) {\n\n/**\n * @class Polymer\n */\n\n// imports\nvar endOfMicrotask = scope.endOfMicrotask;\n\n// logging\nvar log = window.WebComponents ? WebComponents.flags.log : {};\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\n/**\n * Force any pending data changes to be observed before \n * the next task. Data changes are processed asynchronously but are guaranteed\n * to be processed, for example, before painting. This method should rarely be \n * needed. It does nothing when Object.observe is available; \n * when Object.observe is not available, Polymer automatically flushes data \n * changes approximately every 1/10 second. \n * Therefore, `flush` should only be used when a data mutation should be \n * observed sooner than this.\n * \n * @method flush\n */\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    endOfMicrotask(function() {\n      flushing = false;\n      log.data && console.group('flush');\n      Platform.performMicrotaskCheckpoint();\n      log.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    // watch document visiblity to toggle dirty-checking\n    var visibilityHandler = function() {\n      // only flush if the page is visibile\n      if (document.visibilityState === 'hidden') {\n        if (scope.flushPoll) {\n          clearInterval(scope.flushPoll);\n        }\n      } else {\n        scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n      }\n    };\n    if (typeof document.visibilityState === 'string') {\n      document.addEventListener('visibilitychange', visibilityHandler);\n    }\n    visibilityHandler();\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// bc\nPlatform.flush = flush;\n\n})(window.Polymer);\n\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || baseUrl(root);\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, baseUrl(template));\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 || baseUrl(style);\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 || baseUrl(node);\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 = '{{.*}}';\nvar URL_HASH = '#';\n\nfunction baseUrl(node) {\n  var u = new URL(node.ownerDocument.baseURI);\n  u.search = '';\n  u.hash = '';\n  return u;\n}\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 = baseUrl(document.documentElement);\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  // empty '#' is discarded but we need to preserve it.\n  var hash = (targetUrl.href.slice(-1) === URL_HASH) ? URL_HASH : targetUrl.hash;\n  return t.join('/') + targetUrl.search + hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Polymer);\n\n(function(scope) {\n  var endOfMicrotask = Polymer.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(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(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(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(function(scope) {\n\n  // dom polyfill, additions, and utility methods\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(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(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  // helper for deserializing properties of various types to strings\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(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(function(scope) {\n\n  /**\n   * @class polymer-base\n   */\n\n  var utils = {\n\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically. Returns a handle which may \n      * be passed to <a href=\"#cancelAsync\">cancelAsync</a> to cancel the \n      * asynchronous call.\n      *\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      Polymer.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\n    /**\n      * Cancels a pending callback that was scheduled via \n      * <a href=\"#async\">async</a>. \n      *\n      * @method cancelAsync\n      * @param {handle} handle Handle of the `async` to cancel.\n      */\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n\n    /**\n      * Fire an event.\n      *\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    /**\n      * Fire an event asynchronously.\n      *\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    /**\n      * Remove class from old, add class to anew, if they exist.\n      *\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      *\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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        // NOTE: dirty check right after calling method to ensure \n        // changes apply quickly; in a very complicated app using high \n        // frequency events, this can be a perf concern; in this case,\n        // imperative handlers can be used to avoid flushing.\n        Polymer.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  /**\n   * @class Polymer\n   */\n\n  /**\n   * Add a gesture aware event handler to the given `node`. Can be used \n   * in place of `element.addEventListener` and ensures gestures will function\n   * as expected on mobile platforms. Please note that Polymer's declarative\n   * event handlers include this functionality by default.\n   * \n   * @method addEventListener\n   * @param {Node} node node on which to listen\n   * @param {String} eventType name of the event\n   * @param {Function} handlerFn event handler function\n   * @param {Boolean} capture set to true to invoke event capturing\n   * @type Function\n   */\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.addEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n\n  /**\n   * Remove a gesture aware event handler on the given `node`. To remove an\n   * event listener, the exact same arguments are required that were passed\n   * to `Polymer.addEventListener`.\n   * \n   * @method removeEventListener\n   * @param {Node} node node on which to listen\n   * @param {String} eventType name of the event\n   * @param {Function} handlerFn event handler function\n   * @param {Boolean} capture set to true to invoke event capturing\n   * @type Function\n   */\n  scope.removeEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.removeEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n\n})(Polymer);\n\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    // copy attributes defined in the element declaration to the instance\r\n    // e.g. <polymer-element name=\"x-foo\" tabIndex=\"0\"> tabIndex is copied\r\n    // to the element instance here.\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      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    // convert to a string value based on the type of `inferredType`\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    // serializes `name` property value and updates the corresponding attribute\r\n    // note that reflection is opt-in.\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(function(scope) {\n\n  /**\n   * @class polymer-base\n   */\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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    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\n    // creates a CompoundObserver to observe property changes\n    // NOTE, this is only done there are any properties in the `observe` object\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\n    // start observing property changes\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n\n    // handler for property changes; routes changes to observing methods\n    // note: array valued properties are observed for array splices\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\n    // call method iff it exists.\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n\n    /**\n     * Force any pending property changes to synchronously deliver to\n     * handlers specified in the `observe` object.\n     * Note, normally changes are processed at microtask time.\n     *\n     * @method deliverChanges\n     */\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\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\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue)) {\n        return;\n      }\n      // invoke property change side effects\n      this._propertyChanged(name, value, oldValue);\n      // emit change record\n      if (!Observer.hasObjectObserve) {\n        return;\n      }\n      var notifier = this._objectNotifier;\n      if (!notifier) {\n        notifier = this._objectNotifier = Object.getNotifier(this);\n      }\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n      notifier.notify(updateRecord);\n    },\n\n    _propertyChanged: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n\n    // creates a property binding (called via bind) to a published property.\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      var computed = this.element.prototype.computed;\n      // Binding an \"out-only\" value to a computed property. Note that\n      // since this observer isn't opened, it doesn't need to be closed on\n      // cleanup.\n      if (computed && computed[property]) {\n        var privateComputedBoundValue = property + 'ComputedBoundObservable_';\n        this[privateComputedBoundValue] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n\n    // NOTE property `name` must be published. This makes it an accessor.\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      // Present for properties which are computed and published and have a\n      // bound value.\n      var privateComputedBoundValue = name + 'ComputedBoundObservable_';\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n      // observable callback\n      var self = this;\n      function updateValue(value, oldValue) {\n        self[privateName] = value;\n        var setObserveable = self[privateComputedBoundValue];\n        if (setObserveable && typeof setObserveable.setValue == 'function') {\n          setObserveable.setValue(value);\n        }\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      }\n      // resolve initial value\n      var value = observable.open(updateValue);\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue) {\n            observable.setValue(value);\n          }\n        }\n      }\n      updateValue(value, oldValue);\n      // register and return observable\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n          self[privateComputedBoundValue] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\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\n    // property bookkeeping\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n      this._observers.push(observer);\n    },\n\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n      // observer array items are arrays of observers.\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      this._observers = [];\n    },\n\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n\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\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\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(function(scope) {\n\n  /**\n   * @class polymer-base\n   */\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\n\n  // element api supporting mdv\n  var mdv = {\n\n    /**\n     * Creates dom cloned from the given template, instantiating bindings\n     * with this element as the template model and `PolymerExpressions` as the\n     * binding delegate.\n     *\n     * @method instanceTemplate\n     * @param {Template} template source template from which to create dom.\n     */\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\n    // Called by TemplateBinding/NodeBind to setup a binding to the given\n    // property. It's overridden here to support property bindings\n    // in addition to attribute bindings that are supported by default.\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\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n\n    // Called by TemplateBinding when all bindings on an element have been \n    // executed. This signals that all element inputs have been gathered\n    // and it's safe to ready the element, create shadow-root and start\n    // data-observation.\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n\n    // called at detached time to signal that an element's bindings should be\n    // cleaned up. This is done asynchronously so that users have the chance\n    // to call `cancelUnbindAll` to prevent unbinding.\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    \n    /**\n     * This method should rarely be used and only if \n     * <a href=\"#cancelUnbindAll\">`cancelUnbindAll`</a> has been called to \n     * prevent element unbinding. In this case, the element's bindings will \n     * not be automatically cleaned up and it cannot be garbage collected \n     * by the system. If memory pressure is a concern or a \n     * large amount of elements need to be managed in this way, `unbindAll`\n     * can be called to deactivate the element's bindings and allow its \n     * memory to be reclaimed.\n     *\n     * @method unbindAll\n     */\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n\n    /**\n     * Call in `detached` to prevent the element from unbinding when it is \n     * detached from the dom. The element is unbound as a cleanup step that \n     * allows its memory to be reclaimed. \n     * If `cancelUnbindAll` is used, consider calling \n     * <a href=\"#unbindAll\">`unbindAll`</a> when the element is no longer\n     * needed. This will allow its memory to be reclaimed.\n     * \n     * @method cancelUnbindAll\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\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(function(scope) {\n\n  /**\n   * Common prototype for all Polymer Elements.\n   * \n   * @class polymer-base\n   * @homepage polymer.github.io\n   */\n  var base = {\n    /**\n     * Tags this object as the canonical Base prototype.\n     *\n     * @property PolymerBase\n     * @type boolean\n     * @default true\n     */\n    PolymerBase: true,\n\n    /**\n     * Debounce signals. \n     * \n     * Call `job` to defer a named signal, and all subsequent matching signals, \n     * until a wait time has elapsed with no new signal.\n     * \n     *     debouncedClickAction: function(e) {\n     *       // processClick only when it's been 100ms since the last click\n     *       this.job('click', function() {\n     *        this.processClick;\n     *       }, 100);\n     *     }\n     *\n     * @method job\n     * @param String {String} job A string identifier for the job to debounce.\n     * @param Function {Function} callback A function that is called (with `this` context) when the wait time elapses.\n     * @param Number {Number} wait Time in milliseconds (ms) after the last signal that must elapse before invoking `callback`\n     * @type Handle\n     */\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        // TODO(sjmiles): suggest we deprecate this call signature\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n\n    /**\n     * Invoke a superclass method. \n     * \n     * Use `super()` to invoke the most recently overridden call to the \n     * currently executing function. \n     * \n     * To pass arguments through, use the literal `arguments` as the parameter \n     * to `super()`.\n     *\n     *     nextPageAction: function(e) {\n     *       // invoke the superclass version of `nextPageAction`\n     *       this.super(arguments); \n     *     }\n     *\n     * To pass custom arguments, arrange them in an array.\n     *\n     *     appendSerialNo: function(value, serial) {\n     *       // prefix the superclass serial number with our lot # before\n     *       // invoking the superlcass\n     *       return this.super([value, this.lotNo + serial])\n     *     }\n     *\n     * @method super\n     * @type Any\n     * @param {args) An array of arguments to use when calling the superclass method, or null.\n     */\n    super: Polymer.super,\n\n    /**\n     * Lifecycle method called when the element is instantiated.\n     * \n     * Override `created` to perform custom create-time tasks. No need to call \n     * super-class `created` unless you are extending another Polymer element.\n     * Created is called before the element creates `shadowRoot` or prepares\n     * data-observation.\n     * \n     * @method created\n     * @type void\n     */\n    created: function() {\n    },\n\n    /**\n     * Lifecycle method called when the element has populated it's `shadowRoot`,\n     * prepared data-observation, and made itself ready for API interaction.\n     * \n     * @method ready\n     * @type void\n     */\n    ready: function() {\n    },\n\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom create-time tasks, implement `created` \n     * instead, which is called immediately after `createdCallback`. \n     * \n     * @method createdCallback\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\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\n    // system entry point, do not override\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      this.parseDeclarations(this.__proto__);\n      // NOTE: Support use of the `unresolved` attribute to help polyfill\n      // custom elements' `:unresolved` feature.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom tasks in your element, implement `attributeChanged` \n     * instead, which is called immediately after `attributeChangedCallback`. \n     * \n     * @method attributeChangedCallback\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\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom create-time tasks, implement `attached` \n     * instead, which is called immediately after `attachedCallback`. \n     * \n     * @method attachedCallback\n     */\n     attachedCallback: function() {\n      // when the element is attached, prevent it from unbinding.\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n\n     /**\n     * Implement to access custom elements in dom descendants, ancestors, \n     * or siblings. Because custom elements upgrade in document order, \n     * elements accessed in `ready` or `attached` may not be upgraded. When\n     * `domReady` is called, all registered custom elements are guaranteed\n     * to have been upgraded.\n     * \n     * @method domReady\n     */\n\n    /**\n     * Low-level lifecycle method called as part of standard Custom Elements\n     * operation. Polymer implements this method to provide basic default \n     * functionality. For custom create-time tasks, implement `detached` \n     * instead, which is called immediately after `detachedCallback`. \n     * \n     * @method detachedCallback\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\n    /**\n     * Walks the prototype-chain of this element and allows specific\n     * classes a chance to process static declarations.\n     * \n     * In particular, each polymer-element has it's own `template`.\n     * `parseDeclarations` is used to accumulate all element `template`s\n     * from an inheritance chain.\n     *\n     * `parseDeclaration` static methods implemented in the chain are called\n     * recursively, oldest first, with the `<polymer-element>` associated\n     * with the current prototype passed as an argument.\n     * \n     * An element may override this method to customize shadow-root generation. \n     * \n     * @method parseDeclarations\n     */\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n\n    /**\n     * Perform init-time actions based on static information in the\n     * `<polymer-element>` instance argument.\n     *\n     * For example, the standard implementation locates the template associated\n     * with the given `<polymer-element>` and stamps it into a shadow-root to\n     * implement shadow inheritance.\n     *  \n     * An element may override this method for custom behavior. \n     * \n     * @method parseDeclaration\n     */\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\n    /**\n     * Given a `<polymer-element>`, find an associated template (if any) to be\n     * used for shadow-root generation.\n     *\n     * An element may override this method for custom behavior. \n     * \n     * @method fetchTemplate\n     */\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n\n    /**\n     * Create a shadow-root in this host and stamp `template` as it's \n     * content. \n     *\n     * An element may override this method for custom behavior. \n     * \n     * @method shadowFromTemplate\n     */\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\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\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\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\n    /**\n     * Register a one-time callback when a child-list or sub-tree mutation\n     * occurs on node. \n     *\n     * For persistent callbacks, call onMutation from your listener. \n     * \n     * @method onMutation\n     * @param Node {Node} node Node to watch for mutations.\n     * @param Function {Function} listener Function to call on mutation. The function is invoked as `listener.call(this, observer, mutations);` where `observer` is the MutationObserver that triggered the notification, and `mutations` is the native mutation list.\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  /**\n   * @class Polymer\n   */\n  \n  /**\n   * Returns true if the object includes <a href=\"#polymer-base\">polymer-base</a> in it's prototype chain.\n   * \n   * @method isBase\n   * @param Object {Object} object Object to test.\n   * @type Boolean\n   */\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  /**\n   * The Polymer base-class constructor.\n   * \n   * @property Base\n   * @type Function\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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 = WebComponents.ShadowCSS.makeScopeSelector(name, is);\n    return WebComponents.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype(name)) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  function instanceOfType(element, type) {\n    if (typeof type !== 'string') {\n      return false;\n    }\n    var proto = HTMLElement.getPrototypeForTag(type);\n    var ctor = proto && proto.constructor;\n    if (!ctor) {\n      return false;\n    }\n    if (CustomElements.instanceof) {\n      return CustomElements.instanceof(element, ctor);\n    }\n    return element instanceof ctor;\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n  scope.instanceOfType = instanceOfType;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. WebComponents collects those calls until we can process them, which\n  // we do here.\n\n  if (WebComponents.consumeDeclarations) {\n    WebComponents.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(function(scope) {\n\n/**\n * @class polymer-base\n */\n\n /**\n  * Resolve a url path to be relative to a `base` url. If unspecified, `base`\n  * defaults to the element's ownerDocument url. Can be used to resolve\n  * paths from element's in templates loaded in HTMLImports to be relative\n  * to the document containing the element. Polymer automatically does this for\n  * url attributes in element templates; however, if a url, for\n  * example, contains a binding, then `resolvePath` can be used to ensure it is \n  * relative to the element document. For example, in an element's template,\n  *\n  *     <a href=\"{{resolvePath(path)}}\">Resolved</a>\n  * \n  * @method resolvePath\n  * @param {String} url Url path to resolve.\n  * @param {String} base Optional base url against which to resolve, defaults\n  * to the element's ownerDocument url.\n  * returns {String} resolved url.\n  */\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\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(function(scope) {\n\n  // imports\n\n  var log = window.WebComponents ? WebComponents.flags.log : {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\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  // polymer-element declarative api: events feature\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(function(scope) {\n\n  // element api\n\n  var observationBlacklist = ['attribute'];\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          property = n.slice(0, -7);\n          if (this.canObserveProperty(property)) {\n            if (!observe) {\n              observe  = (prototype.observe = {});\n            }\n            observe[property] = observe[property] || n;\n          }\n        }\n      }\n    },\n    canObserveProperty: function(property) {\n      return (observationBlacklist.indexOf(property) < 0);\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        // warn and remove accessor names that are broken on some browsers\n        this.filterInvalidAccessorNames(publish);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n      var computed = prototype.computed;\n      if (computed) {\n        // warn and remove accessor names that are broken on some browsers\n        this.filterInvalidAccessorNames(computed);\n      }\n    },\n    // Publishing/computing a property where the name might conflict with a\n    // browser property is not currently supported to help users of Polymer\n    // avoid browser bugs:\n    //\n    // https://code.google.com/p/chromium/issues/detail?id=43394\n    // https://bugs.webkit.org/show_bug.cgi?id=49739\n    //\n    // We can lift this restriction when those bugs are fixed.\n    filterInvalidAccessorNames: function(propertyNames) {\n      for (var name in propertyNames) {\n        // Check if the name is in our blacklist.\n        if (this.propertyNameBlacklist[name]) {\n          console.warn('Cannot define property \"' + name + '\" for element \"' +\n            this.name + '\" because it has the same name as an HTMLElement ' +\n            'property, and not all browsers support overriding that. ' +\n            'Consider giving it a different name.');\n          // Remove the invalid accessor from the list.\n          delete propertyNames[name];\n        }\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name, ignoreWrites) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          if (ignoreWrites) {\n            return this[privateName];\n          }\n\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n, true);\n        }\n      }\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          // If the property is computed and published, the accessor is created\n          // above.\n          if (!prototype.computed || !prototype.computed[n]) {\n            this.createPropertyAccessor(n);\n          }\n        }\n      }\n    },\n    // This list contains some property names that people commonly want to use,\n    // but won't work because of Chrome/Safari bugs. It isn't an exhaustive\n    // list. In particular it doesn't contain any property names found on\n    // subtypes of HTMLElement (e.g. name, value). Rather it attempts to catch\n    // some common cases.\n    propertyNameBlacklist: {\n      children: 1,\n      'class': 1,\n      id: 1,\n      hidden: 1,\n      style: 1,\n      title: 1,\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\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(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(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        WebComponents.ShadowCSS.shimStyling(this.templateContent(), name,\n          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(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      Polymer.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n  \n    /**\n    Returns a list of elements that have had polymer-elements created but \n    are not yet ready to register. The list is an array of element definitions.\n    */\n    waitingFor: function() {\n      var e$ = [];\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          e$.push(e);\n        }\n      }\n      return e$;\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    Polymer.endOfMicrotask(function() {\n      HTMLImports.whenReady(function() {\n        queue.addReadyCallback(callback);\n        queue.waitToReady = false;\n        queue.check();\n    });\n    });\n  }\n\n  /**\n    Forces polymer to register any pending elements. Can be used to abort\n    waiting for elements that are partially defined.\n    @param timeout {Integer} Optional timeout in milliseconds\n  */\n  function forceReady(timeout) {\n    if (timeout === undefined) {\n      queue.ready();\n      return;\n    }\n    var handle = setTimeout(function() {\n      queue.ready();\n    }, timeout);\n    Polymer.whenReady(function() {\n      clearTimeout(handle);\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.waitingFor = queue.waitingFor.bind(queue);\n  scope.forceReady = forceReady;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n\n(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(function(scope) {\n\n/**\n * @class Polymer\n */\n\nvar whenReady = scope.whenReady;\n\n/**\n * Loads the set of HTMLImports contained in `node`. Notifies when all\n * the imports have loaded by calling the `callback` function argument.\n * This method can be used to lazily load imports. For example, given a \n * template:\n *     \n *     <template>\n *       <link rel=\"import\" href=\"my-import1.html\">\n *       <link rel=\"import\" href=\"my-import2.html\">\n *     </template>\n *\n *     Polymer.importElements(template.content, function() {\n *       console.log('imports lazily loaded'); \n *     });\n * \n * @method importElements\n * @param {Node} node Node containing the HTMLImports to load.\n * @param {Function} callback Callback called when all imports have loaded.\n */\nfunction importElements(node, callback) {\n  if (node) {\n    document.head.appendChild(node);\n    whenReady(callback);\n  } else if (callback) {\n    callback();\n  }\n}\n\n/**\n * Loads an HTMLImport for each url specified in the `urls` array.\n * Notifies when all the imports have loaded by calling the `callback` \n * function argument. This method can be used to lazily load imports. \n * For example,\n *\n *     Polymer.import(['my-import1.html', 'my-import2.html'], function() {\n *       console.log('imports lazily loaded'); \n *     });\n * \n * @method import\n * @param {Array} urls Array of urls to load as HTMLImports.\n * @param {Function} callback Callback called when all imports have loaded.\n */\nfunction _import(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\nscope.import = _import;\nscope.importElements = importElements;\n\n})(Polymer);\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"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/.bower.json",
    "content": "{\n  \"name\": \"webcomponentsjs\",\n  \"main\": \"webcomponents.js\",\n  \"version\": \"0.5.2\",\n  \"homepage\": \"http://webcomponents.org\",\n  \"authors\": [\n    \"The Polymer Authors\"\n  ],\n  \"keywords\": [\n    \"webcomponents\"\n  ],\n  \"license\": \"BSD\",\n  \"ignore\": [],\n  \"_release\": \"0.5.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.5.2\",\n    \"commit\": \"4f469f65d3fa3c03a44326d138331003fa340337\"\n  },\n  \"_source\": \"git://github.com/Polymer/webcomponentsjs.git\",\n  \"_target\": \"^0.5.0\",\n  \"_originalSource\": \"Polymer/webcomponentsjs\"\n}"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/CustomElements.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.CustomElements = window.CustomElements || {\n  flags: {}\n};\n\n(function(scope) {\n  var flags = scope.flags;\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n  scope.hasNative = Boolean(document.registerElement);\n  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n})(CustomElements);\n\nCustomElements.addModule(function(scope) {\n  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : \"none\";\n  function forSubtree(node, cb) {\n    findAllElements(node, function(e) {\n      if (cb(e)) {\n        return true;\n      }\n      forRoots(e, cb);\n    });\n    forRoots(node, cb);\n  }\n  function findAllElements(node, find, data) {\n    var e = node.firstElementChild;\n    if (!e) {\n      e = node.firstChild;\n      while (e && e.nodeType !== Node.ELEMENT_NODE) {\n        e = e.nextSibling;\n      }\n    }\n    while (e) {\n      if (find(e, data) !== true) {\n        findAllElements(e, find, data);\n      }\n      e = e.nextElementSibling;\n    }\n    return null;\n  }\n  function forRoots(node, cb) {\n    var root = node.shadowRoot;\n    while (root) {\n      forSubtree(root, cb);\n      root = root.olderShadowRoot;\n    }\n  }\n  var processingDocuments;\n  function forDocumentTree(doc, cb) {\n    processingDocuments = [];\n    _forDocumentTree(doc, cb);\n    processingDocuments = null;\n  }\n  function _forDocumentTree(doc, cb) {\n    doc = wrap(doc);\n    if (processingDocuments.indexOf(doc) >= 0) {\n      return;\n    }\n    processingDocuments.push(doc);\n    var imports = doc.querySelectorAll(\"link[rel=\" + IMPORT_LINK_TYPE + \"]\");\n    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {\n      if (n.import) {\n        _forDocumentTree(n.import, cb);\n      }\n    }\n    cb(doc);\n  }\n  scope.forDocumentTree = forDocumentTree;\n  scope.forSubtree = forSubtree;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  var forSubtree = scope.forSubtree;\n  var forDocumentTree = scope.forDocumentTree;\n  function addedNode(node) {\n    return added(node) || addedSubtree(node);\n  }\n  function added(node) {\n    if (scope.upgrade(node)) {\n      return true;\n    }\n    attached(node);\n  }\n  function addedSubtree(node) {\n    forSubtree(node, function(e) {\n      if (added(e)) {\n        return true;\n      }\n    });\n  }\n  function attachedNode(node) {\n    attached(node);\n    if (inDocument(node)) {\n      forSubtree(node, function(e) {\n        attached(e);\n      });\n    }\n  }\n  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;\n  scope.hasPolyfillMutations = hasPolyfillMutations;\n  var isPendingMutations = false;\n  var pendingMutations = [];\n  function deferMutation(fn) {\n    pendingMutations.push(fn);\n    if (!isPendingMutations) {\n      isPendingMutations = true;\n      setTimeout(takeMutations);\n    }\n  }\n  function takeMutations() {\n    isPendingMutations = false;\n    var $p = pendingMutations;\n    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {\n      p();\n    }\n    pendingMutations = [];\n  }\n  function attached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _attached(element);\n      });\n    } else {\n      _attached(element);\n    }\n  }\n  function _attached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (!element.__attached && inDocument(element)) {\n        element.__attached = true;\n        if (element.attachedCallback) {\n          element.attachedCallback();\n        }\n      }\n    }\n  }\n  function detachedNode(node) {\n    detached(node);\n    forSubtree(node, function(e) {\n      detached(e);\n    });\n  }\n  function detached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _detached(element);\n      });\n    } else {\n      _detached(element);\n    }\n  }\n  function _detached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (element.__attached && !inDocument(element)) {\n        element.__attached = false;\n        if (element.detachedCallback) {\n          element.detachedCallback();\n        }\n      }\n    }\n  }\n  function inDocument(element) {\n    var p = element;\n    var doc = wrap(document);\n    while (p) {\n      if (p == doc) {\n        return true;\n      }\n      p = p.parentNode || p.host;\n    }\n  }\n  function watchShadow(node) {\n    if (node.shadowRoot && !node.shadowRoot.__watched) {\n      flags.dom && console.log(\"watching shadow-root for: \", node.localName);\n      var root = node.shadowRoot;\n      while (root) {\n        observe(root);\n        root = root.olderShadowRoot;\n      }\n    }\n  }\n  function handler(mutations) {\n    if (flags.dom) {\n      var mx = mutations[0];\n      if (mx && mx.type === \"childList\" && mx.addedNodes) {\n        if (mx.addedNodes) {\n          var d = mx.addedNodes[0];\n          while (d && d !== document && !d.host) {\n            d = d.parentNode;\n          }\n          var u = d && (d.URL || d._URL || d.host && d.host.localName) || \"\";\n          u = u.split(\"/?\").shift().split(\"/\").pop();\n        }\n      }\n      console.group(\"mutations (%d) [%s]\", mutations.length, u || \"\");\n    }\n    mutations.forEach(function(mx) {\n      if (mx.type === \"childList\") {\n        forEach(mx.addedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          addedNode(n);\n        });\n        forEach(mx.removedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          detachedNode(n);\n        });\n      }\n    });\n    flags.dom && console.groupEnd();\n  }\n  function takeRecords(node) {\n    node = wrap(node);\n    if (!node) {\n      node = wrap(document);\n    }\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    var observer = node.__observer;\n    if (observer) {\n      handler(observer.takeRecords());\n      takeMutations();\n    }\n  }\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  function observe(inRoot) {\n    if (inRoot.__observer) {\n      return;\n    }\n    var observer = new MutationObserver(handler);\n    observer.observe(inRoot, {\n      childList: true,\n      subtree: true\n    });\n    inRoot.__observer = observer;\n  }\n  function upgradeDocument(doc) {\n    doc = wrap(doc);\n    flags.dom && console.group(\"upgradeDocument: \", doc.baseURI.split(\"/\").pop());\n    addedNode(doc);\n    observe(doc);\n    flags.dom && console.groupEnd();\n  }\n  function upgradeDocumentTree(doc) {\n    forDocumentTree(doc, upgradeDocument);\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  scope.watchShadow = watchShadow;\n  scope.upgradeDocumentTree = upgradeDocumentTree;\n  scope.upgradeSubtree = addedSubtree;\n  scope.upgradeAll = addedNode;\n  scope.attachedNode = attachedNode;\n  scope.takeRecords = takeRecords;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  function upgrade(node) {\n    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\n      var is = node.getAttribute(\"is\");\n      var definition = scope.getRegisteredDefinition(is || node.localName);\n      if (definition) {\n        if (is && definition.tag == node.localName) {\n          return upgradeWithDefinition(node, definition);\n        } else if (!is && !definition.extends) {\n          return upgradeWithDefinition(node, definition);\n        }\n      }\n    }\n  }\n  function upgradeWithDefinition(element, definition) {\n    flags.upgrade && console.group(\"upgrade:\", element.localName);\n    if (definition.is) {\n      element.setAttribute(\"is\", definition.is);\n    }\n    implementPrototype(element, definition);\n    element.__upgraded__ = true;\n    created(element);\n    scope.attachedNode(element);\n    scope.upgradeSubtree(element);\n    flags.upgrade && console.groupEnd();\n    return element;\n  }\n  function implementPrototype(element, definition) {\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n  function customMixin(inTarget, inSrc, inNative) {\n    var used = {};\n    var p = inSrc;\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, Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n  function created(element) {\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n  scope.upgrade = upgrade;\n  scope.upgradeWithDefinition = upgradeWithDefinition;\n  scope.implementPrototype = implementPrototype;\n});\n\nCustomElements.addModule(function(scope) {\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  var upgrade = scope.upgrade;\n  var upgradeWithDefinition = scope.upgradeWithDefinition;\n  var implementPrototype = scope.implementPrototype;\n  var useNative = scope.useNative;\n  function register(name, options) {\n    var definition = options || {};\n    if (!name) {\n      throw new Error(\"document.registerElement: first argument `name` must not be empty\");\n    }\n    if (name.indexOf(\"-\") < 0) {\n      throw new Error(\"document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '\" + String(name) + \"'.\");\n    }\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    if (getRegisteredDefinition(name)) {\n      throw new Error(\"DuplicateDefinitionError: a type with name '\" + String(name) + \"' is already registered\");\n    }\n    if (!definition.prototype) {\n      definition.prototype = Object.create(HTMLElement.prototype);\n    }\n    definition.__name = name.toLowerCase();\n    definition.lifecycle = definition.lifecycle || {};\n    definition.ancestry = ancestry(definition.extends);\n    resolveTagName(definition);\n    resolvePrototypeChain(definition);\n    overrideAttributeApi(definition.prototype);\n    registerDefinition(definition.__name, definition);\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    definition.prototype.constructor = definition.ctor;\n    if (scope.ready) {\n      upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n  function overrideAttributeApi(prototype) {\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  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 && newValue !== oldValue) {\n      this.attributeChangedCallback(name, oldValue, newValue);\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  var reservedTagList = [ \"annotation-xml\", \"color-profile\", \"font-face\", \"font-face-src\", \"font-face-uri\", \"font-face-format\", \"font-face-name\", \"missing-glyph\" ];\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([ extendee ]);\n    }\n    return [];\n  }\n  function resolveTagName(definition) {\n    var baseTag = definition.extends;\n    for (var i = 0, a; a = definition.ancestry[i]; i++) {\n      baseTag = a.is && a.tag;\n    }\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      definition.is = definition.__name;\n    }\n  }\n  function resolvePrototypeChain(definition) {\n    if (!Object.__proto__) {\n      var nativePrototype = HTMLElement.prototype;\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\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      definition.native = nativePrototype;\n    }\n  }\n  function instantiate(definition) {\n    return upgradeWithDefinition(domCreateElement(definition.tag), definition);\n  }\n  var registry = {};\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n  var HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n  function createElementNS(namespace, tag, typeExtension) {\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n  function createElement(tag, typeExtension) {\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n    var element;\n    if (typeExtension) {\n      element = createElement(tag);\n      element.setAttribute(\"is\", typeExtension);\n      return element;\n    }\n    element = domCreateElement(tag);\n    if (tag.indexOf(\"-\") >= 0) {\n      implementPrototype(element, HTMLElement);\n    }\n    return element;\n  }\n  function cloneNode(deep) {\n    var n = domCloneNode.call(this, deep);\n    upgrade(n);\n    return n;\n  }\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n  var domCloneNode = Node.prototype.cloneNode;\n  var isInstance;\n  if (!Object.__proto__ && !useNative) {\n    isInstance = function(obj, ctor) {\n      var p = obj;\n      while (p) {\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  document.registerElement = register;\n  document.createElement = createElement;\n  document.createElementNS = createElementNS;\n  Node.prototype.cloneNode = cloneNode;\n  scope.registry = registry;\n  scope.instanceof = isInstance;\n  scope.reservedTagList = reservedTagList;\n  scope.getRegisteredDefinition = getRegisteredDefinition;\n  document.register = document.registerElement;\n});\n\n(function(scope) {\n  var useNative = scope.useNative;\n  var initializeModules = scope.initializeModules;\n  var isIE11OrOlder = /Trident/.test(navigator.userAgent);\n  if (useNative) {\n    var nop = function() {};\n    scope.watchShadow = nop;\n    scope.upgrade = nop;\n    scope.upgradeAll = nop;\n    scope.upgradeDocumentTree = nop;\n    scope.upgradeSubtree = nop;\n    scope.takeRecords = nop;\n    scope.instanceof = function(obj, base) {\n      return obj instanceof base;\n    };\n  } else {\n    initializeModules();\n  }\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  if (!window.wrap) {\n    if (window.ShadowDOMPolyfill) {\n      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n    } else {\n      window.wrap = window.unwrap = function(node) {\n        return node;\n      };\n    }\n  }\n  function bootstrap() {\n    upgradeDocumentTree(wrap(document));\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        upgradeDocumentTree(wrap(elt.import));\n      };\n    }\n    CustomElements.ready = true;\n    setTimeout(function() {\n      CustomElements.readyTime = Date.now();\n      if (window.HTMLImports) {\n        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n      }\n      document.dispatchEvent(new CustomEvent(\"WebComponentsReady\", {\n        bubbles: true\n      }));\n    });\n  }\n  if (isIE11OrOlder && 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  if (document.readyState === \"complete\" || scope.flags.eager) {\n    bootstrap();\n  } else if (document.readyState === \"interactive\" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {\n    bootstrap();\n  } else {\n    var loadEvent = window.HTMLImports && !HTMLImports.ready ? \"HTMLImportsLoaded\" : \"DOMContentLoaded\";\n    window.addEventListener(loadEvent, bootstrap);\n  }\n})(window.CustomElements);"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/HTMLImports.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.HTMLImports = window.HTMLImports || {\n  flags: {}\n};\n\n(function(scope) {\n  var IMPORT_LINK_TYPE = \"import\";\n  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement(\"link\"));\n  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\n  var wrap = function(node) {\n    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n  };\n  var rootDocument = wrap(document);\n  var currentScriptDescriptor = {\n    get: function() {\n      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== \"complete\" ? document.scripts[document.scripts.length - 1] : null);\n      return wrap(script);\n    },\n    configurable: true\n  };\n  Object.defineProperty(document, \"_currentScript\", currentScriptDescriptor);\n  Object.defineProperty(rootDocument, \"_currentScript\", currentScriptDescriptor);\n  var isIE = /Trident|Edge/.test(navigator.userAgent);\n  function whenReady(callback, doc) {\n    doc = doc || rootDocument;\n    whenDocumentReady(function() {\n      watchImportsLoad(callback, doc);\n    }, doc);\n  }\n  var requiredReadyState = isIE ? \"complete\" : \"interactive\";\n  var READY_EVENT = \"readystatechange\";\n  function isDocumentReady(doc) {\n    return doc.readyState === \"complete\" || doc.readyState === requiredReadyState;\n  }\n  function whenDocumentReady(callback, doc) {\n    if (!isDocumentReady(doc)) {\n      var checkReady = function() {\n        if (doc.readyState === \"complete\" || 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  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n  function 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 && callback) {\n        callback();\n      }\n    }\n    function loadedImport(e) {\n      markTargetLoaded(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            target: imp\n          });\n        } else {\n          imp.addEventListener(\"load\", loadedImport);\n          imp.addEventListener(\"error\", loadedImport);\n        }\n      }\n    } else {\n      checkDone();\n    }\n  }\n  function isImportLoaded(link) {\n    return useNative ? link.__loaded || link.import && link.import.readyState !== \"loading\" : link.__importParsed;\n  }\n  if (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, {\n      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    function isImport(element) {\n      return element.localName === \"link\" && element.rel === \"import\";\n    }\n    function handleImport(element) {\n      var loaded = element.import;\n      if (loaded) {\n        markTargetLoaded({\n          target: element\n        });\n      } else {\n        element.addEventListener(\"load\", markTargetLoaded);\n        element.addEventListener(\"error\", markTargetLoaded);\n      }\n    }\n    (function() {\n      if (document.readyState === \"loading\") {\n        var imports = document.querySelectorAll(\"link[rel=import]\");\n        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {\n          handleImport(imp);\n        }\n      }\n    })();\n  }\n  whenReady(function() {\n    HTMLImports.ready = true;\n    HTMLImports.readyTime = new Date().getTime();\n    rootDocument.dispatchEvent(new CustomEvent(\"HTMLImportsLoaded\", {\n      bubbles: true\n    }));\n  });\n  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n  scope.useNative = useNative;\n  scope.rootDocument = rootDocument;\n  scope.whenReady = whenReady;\n  scope.isIE = isIE;\n})(HTMLImports);\n\n(function(scope) {\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n})(HTMLImports);\n\nHTMLImports.addModule(function(scope) {\n  var CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n  var CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n  var 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  scope.path = path;\n});\n\nHTMLImports.addModule(function(scope) {\n  xhr = {\n    async: true,\n    ok: function(request) {\n      return request.status >= 200 && request.status < 300 || request.status === 304 || 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          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = locationHeader.substr(0, 1) === \"/\" ? location.origin + locationHeader : locationHeader;\n          }\n          next.call(nextContext, !xhr.ok(request) && request, 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  scope.xhr = xhr;\n});\n\nHTMLImports.addModule(function(scope) {\n  var xhr = scope.xhr;\n  var flags = scope.flags;\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  Loader.prototype = {\n    addNodes: function(nodes) {\n      this.inflight += nodes.length;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        this.require(n);\n      }\n      this.checkDone();\n    },\n    addNode: function(node) {\n      this.inflight++;\n      this.require(node);\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      elt.__nodeUrl = url;\n      if (!this.dedupe(url, elt)) {\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        this.pending[url].push(elt);\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        this.tail();\n        return true;\n      }\n      this.pending[url] = [ elt ];\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log(\"fetch\", url, elt);\n      if (url.match(/^data:/)) {\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      }\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        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  scope.Loader = Loader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var Observer = function(addCallback) {\n    this.addCallback = addCallback;\n    this.mo = new MutationObserver(this.handler.bind(this));\n  };\n  Observer.prototype = {\n    handler: function(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          this.addedNodes(m.addedNodes);\n        }\n      }\n    },\n    addedNodes: function(nodes) {\n      if (this.addCallback) {\n        this.addCallback(nodes);\n      }\n      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {\n        if (n.children && n.children.length) {\n          this.addedNodes(n.children);\n        }\n      }\n    },\n    observe: function(root) {\n      this.mo.observe(root, {\n        childList: true,\n        subtree: true\n      });\n    }\n  };\n  scope.Observer = Observer;\n});\n\nHTMLImports.addModule(function(scope) {\n  var path = scope.path;\n  var rootDocument = scope.rootDocument;\n  var flags = scope.flags;\n  var isIE = scope.isIE;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = \"link[rel=\" + IMPORT_LINK_TYPE + \"]\";\n  var importParser = {\n    documentSelectors: IMPORT_SELECTOR,\n    importsSelectors: [ IMPORT_SELECTOR, \"link[rel=stylesheet]\", \"style\", \"script:not([type])\", 'script[type=\"text/javascript\"]' ].join(\",\"),\n    map: {\n      link: \"parseLink\",\n      script: \"parseScript\",\n      style: \"parseStyle\"\n    },\n    dynamicElements: [],\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    parseDynamic: function(elt, quiet) {\n      this.dynamicElements.push(elt);\n      if (!quiet) {\n        this.parseNext();\n      }\n    },\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      this.markDynamicParsingComplete(elt);\n      if (elt.__importElement) {\n        elt.__importElement.__importParsed = true;\n        this.markDynamicParsingComplete(elt.__importElement);\n      }\n      this.parsingElement = null;\n      flags.parse && console.log(\"completed\", elt);\n    },\n    markDynamicParsingComplete: function(elt) {\n      var i = this.dynamicElements.indexOf(elt);\n      if (i >= 0) {\n        this.dynamicElements.splice(i, 1);\n      }\n    },\n    parseImport: function(elt) {\n      if (HTMLImports.__importsParsingHook) {\n        HTMLImports.__importsParsingHook(elt);\n      }\n      if (elt.import) {\n        elt.import.__importParsed = true;\n      }\n      this.markParsingComplete(elt);\n      if (elt.__resource && !elt.__error) {\n        elt.dispatchEvent(new CustomEvent(\"load\", {\n          bubbles: false\n        }));\n      } else {\n        elt.dispatchEvent(new CustomEvent(\"error\", {\n          bubbles: false\n        }));\n      }\n      if (elt.__pending) {\n        var fn;\n        while (elt.__pending.length) {\n          fn = elt.__pending.shift();\n          if (fn) {\n            fn({\n              target: elt\n            });\n          }\n        }\n      }\n      this.parseNext();\n    },\n    parseLink: function(linkElt) {\n      if (nodeIsImport(linkElt)) {\n        this.parseImport(linkElt);\n      } else {\n        linkElt.href = linkElt.href;\n        this.parseGeneric(linkElt);\n      }\n    },\n    parseStyle: function(elt) {\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      port.parentNode.insertBefore(elt, port);\n    },\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      if (isIE && elt.localName === \"style\") {\n        var fakeLoad = false;\n        if (elt.textContent.indexOf(\"@import\") == -1) {\n          fakeLoad = true;\n        } else if (elt.sheet) {\n          fakeLoad = true;\n          var csr = elt.sheet.cssRules;\n          var len = csr ? csr.length : 0;\n          for (var i = 0, r; i < len && (r = csr[i]); i++) {\n            if (r.type === CSSRule.IMPORT_RULE) {\n              fakeLoad = fakeLoad && Boolean(r.styleSheet);\n            }\n          }\n        }\n        if (fakeLoad) {\n          elt.dispatchEvent(new CustomEvent(\"load\", {\n            bubbles: false\n          }));\n        }\n      }\n    },\n    parseScript: function(scriptElt) {\n      var script = document.createElement(\"script\");\n      script.__importElement = scriptElt;\n      script.src = scriptElt.src ? scriptElt.src : 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    nextToParse: function() {\n      this._mayParse = [];\n      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());\n    },\n    nextToParseInDoc: function(doc, link) {\n      if (doc && this._mayParse.indexOf(doc) < 0) {\n        this._mayParse.push(doc);\n        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {\n          if (!this.isParsed(n)) {\n            if (this.hasResource(n)) {\n              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n            } else {\n              return;\n            }\n          }\n        }\n      }\n      return link;\n    },\n    nextToParseDynamic: function() {\n      return this.dynamicElements[0];\n    },\n    parseSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;\n    },\n    isParsed: function(node) {\n      return node.__importParsed;\n    },\n    needsDynamicParsing: function(elt) {\n      return this.dynamicElements.indexOf(elt) >= 0;\n    },\n    hasResource: function(node) {\n      if (nodeIsImport(node) && node.import === undefined) {\n        return false;\n      }\n      return true;\n    }\n  };\n  function nodeIsImport(elt) {\n    return elt.localName === \"link\" && elt.rel === IMPORT_LINK_TYPE;\n  }\n  function generateScriptDataUrl(script) {\n    var scriptContent = generateScriptContent(script);\n    return \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(scriptContent);\n  }\n  function generateScriptContent(script) {\n    return script.textContent + generateSourceMapHint(script);\n  }\n  function generateSourceMapHint(script) {\n    var owner = script.ownerDocument;\n    owner.__importedScripts = owner.__importedScripts || 0;\n    var moniker = script.ownerDocument.baseURI;\n    var num = owner.__importedScripts ? \"-\" + owner.__importedScripts : \"\";\n    owner.__importedScripts++;\n    return \"\\n//# sourceURL=\" + moniker + num + \".js\\n\";\n  }\n  function cloneStyle(style) {\n    var clone = style.ownerDocument.createElement(\"style\");\n    clone.textContent = style.textContent;\n    path.resolveUrlsInStyle(clone);\n    return clone;\n  }\n  scope.parser = importParser;\n  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;\n});\n\nHTMLImports.addModule(function(scope) {\n  var flags = scope.flags;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;\n  var rootDocument = scope.rootDocument;\n  var Loader = scope.Loader;\n  var Observer = scope.Observer;\n  var parser = scope.parser;\n  var importer = {\n    documents: {},\n    documentPreloadSelectors: IMPORT_SELECTOR,\n    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(\",\"),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log(\"loaded\", url, elt);\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isImportLink(elt)) {\n        var doc = this.documents[url];\n        if (doc === undefined) {\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            this.bootDocument(doc);\n          }\n          this.documents[url] = doc;\n        }\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observer.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));\n  importer.observer = new Observer();\n  function isImportLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n  function isLinkRel(elt, rel) {\n    return elt.localName === \"link\" && elt.getAttribute(\"rel\") === rel;\n  }\n  function makeDocument(resource, url) {\n    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    doc._URL = url;\n    var base = doc.createElement(\"base\");\n    base.setAttribute(\"href\", url);\n    if (!doc.baseURI) {\n      Object.defineProperty(doc, \"baseURI\", {\n        value: url\n      });\n    }\n    var meta = doc.createElement(\"meta\");\n    meta.setAttribute(\"charset\", \"utf-8\");\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    doc.body.innerHTML = resource;\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\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    Object.defineProperty(document, \"baseURI\", baseURIDescriptor);\n    Object.defineProperty(rootDocument, \"baseURI\", baseURIDescriptor);\n  }\n  scope.importer = importer;\n  scope.importLoader = importLoader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var parser = scope.parser;\n  var importer = scope.importer;\n  var dynamic = {\n    added: function(nodes) {\n      var owner, parsed;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        if (!owner) {\n          owner = n.ownerDocument;\n          parsed = parser.isParsed(owner);\n        }\n        loading = this.shouldLoadNode(n);\n        if (loading) {\n          importer.loadNode(n);\n        }\n        if (this.shouldParseNode(n) && parsed) {\n          parser.parseDynamic(n, loading);\n        }\n      }\n    },\n    shouldLoadNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));\n    },\n    shouldParseNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));\n    }\n  };\n  importer.observer.addCallback = dynamic.added.bind(dynamic);\n  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;\n});\n\n(function(scope) {\n  var initializeModules = scope.initializeModules;\n  var isIE = scope.isIE;\n  if (scope.useNative) {\n    return;\n  }\n  if (isIE && 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  initializeModules();\n  var rootDocument = scope.rootDocument;\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(rootDocument);\n  }\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\" && !window.attachEvent) {\n    bootstrap();\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", bootstrap);\n  }\n})(HTMLImports);"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/README.md",
    "content": "webcomponents.js\n================\n\nA suite of polyfills supporting the [Web Components](http://webcomponents.org) specs:\n\n**Custom Elements**: allows authors to define their own custom tags ([spec](https://w3c.github.io/webcomponents/spec/custom/)).\n\n**HTML Imports**: a way to include and reuse HTML documents via other HTML documents ([spec](https://w3c.github.io/webcomponents/spec/imports/)).\n\n**Shadow DOM**: provides encapsulation by hiding DOM subtrees under shadow roots ([spec](https://w3c.github.io/webcomponents/spec/shadow/)).\n\nThis also folds in polyfills for `MutationObserver` and `WeakMap`.\n\n\n## Releases\n\nPre-built (concatenated & minified) versions of the polyfills are maintained in the [tagged versions](https://github.com/webcomponents/webcomponentsjs/releases) of this repo. There are two variants:\n\n`webcomponents.js` includes all of the polyfills.\n\n`webcomponents-lite.js` includes all polyfills except for shadow DOM.\n\n\n### Manually Building\n\nIf you wish to build the polyfills yourself, you'll need `node` and `gulp` on your system:\n\n * install [node.js](http://nodejs.org/) using the instructions on their website\n * use `npm` to install [gulp.js](http://gulpjs.com/): `npm install -g gulp`\n\nNow you are ready to build the polyfills with:\n\n    # install dependencies\n    npm install\n    # build\n    gulp build\n\nThe builds will be placed into the `dist/` directory.\n\n## Contribute\n\nSee the [contributing guide](CONTRIBUTING.md)\n\n\n"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/ShadowDOM.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  \"use strict\";\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n  function detectEval() {\n    if (typeof chrome !== \"undefined\" && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n    try {\n      var f = new Function(\"return true;\");\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n  var hasEval = detectEval();\n  function assert(b) {\n    if (!b) throw new Error(\"Assertion failed\");\n  }\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\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  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  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object) return propertyNames[i];\n    }\n  }\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n  getOwnPropertyNames(window);\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor) return wrapperConstructor;\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n    return GeneratedWrapper;\n  }\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name) : function() {\n      return this.__impl4cf1e782hg__[name];\n    };\n  }\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ? new Function(\"v\", \"this.__impl4cf1e782hg__.\" + name + \" = v\") : function(v) {\n      this.__impl4cf1e782hg__[name] = v;\n    };\n  }\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name + \".apply(this.__impl4cf1e782hg__, arguments)\") : function() {\n      return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);\n    };\n  }\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      return dummyDescriptor;\n    }\n  }\n  var isBrokenSafari = function() {\n    var descr = Object.getOwnPropertyDescriptor(Node.prototype, \"nodeType\");\n    return descr && !descr.get && !descr.set;\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_\") continue;\n      if (name in target) continue;\n      if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;\n      if (isFirefox) {\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      var isEvent = isEventHandlerName(name);\n      if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);\n      if (descriptor.writable || descriptor.set || isBrokenSafari) {\n        if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);\n      }\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\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  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);\n    defineNonEnumerableDataProperty(wrapperPrototype, \"constructor\", wrapperConstructor);\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;\n  }\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n    return GeneratedWrapper;\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    return GeneratedWrapper;\n  }\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n  function wrap(impl) {\n    if (impl === null) return null;\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ || (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n  function unwrap(wrapper) {\n    if (wrapper === null) return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n  function rewrap(node, wrapper) {\n    if (wrapper === null) return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\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  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})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n  function ArraySplice() {}\n  ArraySplice.prototype = {\n    calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n      for (var j = 0; j < columnCount; j++) distances[0][j] = j;\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])) distances[i][j] = distances[i - 1][j - 1]; 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      return distances;\n    },\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        var min;\n        if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;\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      edits.reverse();\n      return edits;\n    },\n    calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);\n      if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);\n        return [ splice ];\n      } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n      var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));\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          index++;\n          oldIndex++;\n          break;\n\n         case EDIT_UPDATE:\n          if (!splice) splice = newSplice(index, [], 0);\n          splice.addedCount++;\n          index++;\n          splice.removed.push(old[oldIndex]);\n          oldIndex++;\n          break;\n\n         case EDIT_ADD:\n          if (!splice) splice = newSplice(index, [], 0);\n          splice.addedCount++;\n          index++;\n          break;\n\n         case EDIT_DELETE:\n          if (!splice) splice = newSplice(index, [], 0);\n          splice.removed.push(old[oldIndex]);\n          oldIndex++;\n          break;\n        }\n      }\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;\n      return searchLength;\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])) count++;\n      return count;\n    },\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0, previous.length);\n    },\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n  scope.ArraySplice = ArraySplice;\n})(window.ShadowDOMPolyfill);\n\n(function(context) {\n  \"use strict\";\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\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  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {\n      characterData: true\n    });\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n  } else {\n    timerFunc = window.setTimeout;\n  }\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending) return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n  context.setEndOfMicrotask = setEndOfMicrotask;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var setEndOfMicrotask = scope.setEndOfMicrotask;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n  function scheduleCallback(observer) {\n    if (observer.scheduled_) return;\n    observer.scheduled_ = true;\n    globalMutationObservers.push(observer);\n    if (isScheduled) return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n  function notifyObservers() {\n    isScheduled = false;\n    while (globalMutationObservers.length) {\n      var notifyList = globalMutationObservers;\n      globalMutationObservers = [];\n      notifyList.sort(function(x, y) {\n        return x.uid_ - y.uid_;\n      });\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        mo.scheduled_ = false;\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n        }\n      }\n    }\n  }\n  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  function registerTransientObservers(ancestor, node) {\n    for (;ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations) continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree) registration.addTransientObserver(node);\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) return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer) registration.removeTransientObservers();\n      }\n    }\n  }\n  function enqueueMutation(target, type, data) {\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        if (node !== target && !options.subtree) continue;\n        if (type === \"attributes\" && !options.attributes) continue;\n        if (type === \"attributes\" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n        if (type === \"characterData\" && !options.characterData) continue;\n        if (type === \"childList\" && !options.childList) continue;\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n        if (type === \"attributes\" && options.attributeOldValue || type === \"characterData\" && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n      if (\"name\" in data && \"namespace\" in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n      if (data.addedNodes) record.addedNodes = data.addedNodes;\n      if (data.removedNodes) record.removedNodes = data.removedNodes;\n      if (data.previousSibling) record.previousSibling = data.previousSibling;\n      if (data.nextSibling) record.nextSibling = data.nextSibling;\n      if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];\n      scheduleCallback(observer);\n      observer.records_.push(record);\n    }\n  }\n  var slice = Array.prototype.slice;\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n    if (!(\"attributes\" in options) && (\"attributeOldValue\" in options || \"attributeFilter\" in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n    if (\"characterDataOldValue\" in options && !(\"characterData\" in options)) this.characterData = true; else this.characterData = !!options.characterData;\n    if (!this.attributes && (options.attributeOldValue || \"attributeFilter\" in options) || !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\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 || 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  var uidCounter = 0;\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n    this.scheduled_ = false;\n  }\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      var newOptions = new MutationObserverOptions(options);\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeTransientObservers();\n          registration.options = newOptions;\n        }\n      }\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\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            registrations.splice(i, 1);\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      scheduleCallback(this.observer);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\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            break;\n          }\n        }\n      }\n    }\n  };\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  function TreeScope(root, parent) {\n    this.root = root;\n    this.parent = parent;\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    contains: function(treeScope) {\n      for (;treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this) return true;\n      }\n      return false;\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  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n    if (node.treeScope_) return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  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  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot) path.push(olderShadowRoot);\n          }\n          path.push(insertionPoint);\n        }\n        current = destinationInsertionPoints[destinationInsertionPoints.length - 1];\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            break;\n          }\n          current = current.host;\n          path.push(current);\n        } else {\n          current = current.parentNode;\n          if (current) path.push(current);\n        }\n      }\n    }\n    return path;\n  }\n  function eventMustBeStopped(event) {\n    if (!event) return false;\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  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0) return currentTarget;\n    if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree) return node;\n    }\n    return path[path.length - 1];\n  }\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\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) result = a; else break;\n    }\n    return result;\n  }\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent) return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n    var lowestCommonAncestorTree;\n    var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n    if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;\n    for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree) return node;\n      }\n    }\n    return null;\n  }\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n  var pendingError;\n  function dispatchOriginalEvent(originalEvent) {\n    if (handledEventsTable.get(originalEvent)) 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  function isLoadLikeEvent(event) {\n    switch (event.type) {\n     case \"load\":\n     case \"beforeunload\":\n     case \"unload\":\n      return true;\n    }\n    return false;\n  }\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event)) throw new Error(\"InvalidStateError\");\n    currentlyDispatchingEvents.set(event, true);\n    scope.renderAllPending();\n    var eventPath;\n    var overrideTarget;\n    var win;\n    if (isLoadLikeEvent(event) && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n        if (!isLoadLikeEvent(event)) {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document) win = doc.defaultView;\n        }\n      }\n    }\n    eventPathTable.set(event, eventPath);\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n    return event.defaultPrevented;\n  }\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;\n    }\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;\n    }\n    return true;\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  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)) return;\n    }\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners) return true;\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE) return true;\n      if (phase === BUBBLING_PHASE) phase = AT_TARGET;\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n    if (\"relatedTarget\" in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n      if (unwrappedRelatedTarget) {\n        if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n          var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target) return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n    listeners.depth++;\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      if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n      try {\n        if (typeof listener.handler === \"function\") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);\n        if (stopImmediatePropagationTable.get(event)) return false;\n      } catch (ex) {\n        if (!pendingError) pendingError = ex;\n      }\n    }\n    listeners.depth--;\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) listeners.push(copy[i]);\n      }\n    }\n    return !stopPropagationTable.get(event);\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 && this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    keyLocation: true\n  };\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === \"beforeunload\" && !(this instanceof BeforeUnloadEvent)) {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, \"Event\", type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath) return [];\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  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget) return options;\n    return Object.create(options, {\n      relatedTarget: {\n        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) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype) mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent(\"temp\"));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n  var UIEvent = registerGenericEvent(\"UIEvent\", Event);\n  var CustomEvent = registerGenericEvent(\"CustomEvent\", Event);\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      if (relatedTarget !== undefined) return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\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  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction(\"initMouseEvent\", 14)\n  }, relatedTargetProto);\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction(\"initFocusEvent\", 5)\n  }, relatedTargetProto);\n  var MouseEvent = registerGenericEvent(\"MouseEvent\", UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent(\"FocusEvent\", UIEvent, focusEventProto);\n  var defaultInitDicts = Object.create(null);\n  var supportsEventConstructors = function() {\n    try {\n      new window.FocusEvent(\"focus\");\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  }();\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));\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 ? options[key] : defaultDict[key];\n      if (key === \"relatedTarget\") v = unwrap(v);\n      args.push(v);\n    });\n    event[\"init\" + name].apply(event, args);\n    return event;\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      defaultInitDicts[name] = initDict;\n    };\n    configureEventConstructor(\"Event\", {\n      bubbles: false,\n      cancelable: false\n    });\n    configureEventConstructor(\"CustomEvent\", {\n      detail: null\n    }, \"Event\");\n    configureEventConstructor(\"UIEvent\", {\n      view: null,\n      detail: 0\n    }, \"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\", {\n      relatedTarget: null\n    }, \"UIEvent\");\n  }\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\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  if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n  function isValidListener(fun) {\n    if (typeof fun === \"function\") return true;\n    return fun && fun.handleEvent;\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  var OriginalEventTarget = window.EventTarget;\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n  var methodNames = [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ];\n  [ Node, Window ].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + \"_\", {\n        value: p[name]\n      });\n    });\n  });\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type)) return;\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        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i])) return;\n        }\n      }\n      listeners.push(listener);\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) 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      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n      handledEventsTable.set(nativeEvent, false);\n      scope.renderAllPending();\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener) this.removeEventListener(eventType, tempListener, true);\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) return true;\n      }\n    }\n    return false;\n  }\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type)) return true;\n    }\n    return false;\n  }\n  if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n  var originalElementFromPoint = document.elementFromPoint;\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n    var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element) return null;\n    var path = getEventPath(element, null);\n    var idx = path.lastIndexOf(self);\n    if (idx == -1) return null; else path = path.slice(0, idx);\n    return eventRetargetting(path, self);\n  }\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;\n    };\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      var old = inlineEventHandlers[name];\n      if (old) this.removeEventListener(eventType, old.wrapped, false);\n      if (typeof value === \"function\") {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false) e.preventDefault(); else if (name === \"onbeforeunload\" && typeof rv === \"string\") e.returnValue = rv;\n        };\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\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})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent) return;\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent(\"TouchEvent\");\n  } catch (ex) {\n    return;\n  }\n  var nonEnumDescriptor = {\n    enumerable: false\n  };\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n  [ \"clientX\", \"clientY\", \"screenX\", \"screenY\", \"pageX\", \"pageY\", \"identifier\", \"webkitRadiusX\", \"webkitRadiusY\", \"webkitRotationAngle\", \"webkitForce\" ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, \"length\");\n  }\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\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  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n    initTouchEvent: function() {\n      throw new Error(\"Not implemented\");\n    }\n  });\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n  var nonEnumDescriptor = {\n    enumerable: false\n  };\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\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  function wrapNodeList(list) {\n    if (list == null) 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  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n  var surpressMutations = false;\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, \"childList\", {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, \"childList\", {\n      removedNodes: nodes\n    });\n  }\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\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      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      if (previousNode) previousNode.nextSibling_ = nodes[0];\n      if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];\n      return nodes;\n    }\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      oldParent.removeChild(node);\n    }\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode) previousNode.nextSibling_ = node;\n    if (nextNode) nextNode.previousSibling_ = node;\n    return nodes;\n  }\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\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  function snapshotNodeList(nodeList) {\n    return nodeList;\n  }\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\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  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);\n  }\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length) return;\n    var ownerDoc = owner.ownerDocument;\n    if (ownerDoc === nodes[0].ownerDocument) return;\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n    if (length === 1) return unwrap(nodes[0]);\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  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  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) originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ = 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  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\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  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild; child; child = child.nextSibling) {\n          cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    return clone;\n  }\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child)) return false;\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self) return true;\n    }\n    return false;\n  }\n  var OriginalNode = window.Node;\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n    EventTarget.call(this, original);\n    this.parentNode_ = undefined;\n    this.firstChild_ = undefined;\n    this.lastChild_ = undefined;\n    this.nextSibling_ = undefined;\n    this.previousSibling_ = undefined;\n    this.treeScope_ = undefined;\n  }\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n  var isIe = /Trident|Edge/.test(navigator.userAgent);\n  var removeChildOriginalHelper = isIe ? function(parent, child) {\n    try {\n      originalRemoveChild.call(parent, child);\n    } catch (ex) {\n      if (!(parent instanceof OriginalDocumentFragment)) throw ex;\n    }\n  } : function(parent, child) {\n    originalRemoveChild.call(parent, child);\n  };\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\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      refWrapper && assert(refWrapper.parentNode === this);\n      var nodes;\n      var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;\n      var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);\n      if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode) this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;\n        }\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n        if (parentNode) {\n          originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n      enqueueMutation(this, \"childList\", {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n      nodesWereAdded(nodes, this);\n      return childWrapper;\n    },\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          throw new Error(\"NotFoundError\");\n        }\n      }\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n      if (this.invalidateShadowRenderer()) {\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n        var parentNode = childNode.parentNode;\n        if (parentNode) removeChildOriginalHelper(parentNode, childNode);\n        if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;\n        }\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n      if (!surpressMutations) {\n        enqueueMutation(this, \"childList\", {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n      registerTransientObservers(this, childWrapper);\n      return childWrapper;\n    },\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n      if (oldChildWrapper.parentNode !== this) {\n        throw new Error(\"NotFoundError\");\n      }\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n      var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);\n      }\n      enqueueMutation(this, \"childList\", {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n      return oldChildWrapper;\n    },\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n    get parentNode() {\n      return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n    get firstChild() {\n      return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n    get lastChild() {\n      return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\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    get textContent() {\n      var s = \"\";\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      if (textContent == null) textContent = \"\";\n      var removedNodes = snapshotNodeList(this.childNodes);\n      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      var addedNodes = snapshotNodeList(this.childNodes);\n      enqueueMutation(this, \"childList\", {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\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    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n    compareDocumentPosition: function(otherNode) {\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));\n    },\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = \"\";\n      var modNode;\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) this.removeNode(n); else if (!modNode) modNode = 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.normalize();\n        }\n      }\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n  defineWrapGetter(Node, \"ownerDocument\");\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  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.originalInsertBefore = originalInsertBefore;\n  scope.originalRemoveChild = originalRemoveChild;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\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    return index;\n  }\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, \" \");\n  }\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector)) return el;\n      m = findOne(el, selector);\n      if (m) return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n  var XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n  function matchesEveryThing() {\n    return true;\n  }\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1)) result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\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      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      return findElements(this, index, result, p, selector, null);\n    }\n    return filterNodeList(list, index, result, deep);\n  }\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\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        return findOne(this, selector);\n      }\n      if (!wrappedItem) {\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          return findOne(this, selector);\n        }\n      }\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n      var result = new NodeList();\n      result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);\n      return result;\n    }\n  };\n  function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName, lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);\n    } else {\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n    return filterNodeList(list, index, result, false);\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      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      return findElements(this, index, result, p, ns, localName);\n    }\n    return filterNodeList(list, index, result, false);\n  }\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === \"*\" ? matchesEveryThing : matchesTagName;\n      result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());\n      return result;\n    },\n    getElementsByClassName: function(className) {\n      return this.querySelectorAll(\".\" + className);\n    },\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n      if (ns === \"*\") {\n        match = localName === \"*\" ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === \"*\" ? matchesNameSpace : matchesLocalNameNS;\n      }\n      result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);\n      return result;\n    }\n  };\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var NodeList = scope.wrappers.NodeList;\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n    remove: function() {\n      var p = this.parentNode;\n      if (p) p.removeChild(this);\n    }\n  };\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalCharacterData = window.CharacterData;\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  mixin(CharacterData.prototype, ChildNodeInterface);\n  registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(\"\"));\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n  var OriginalText = window.Text;\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) 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) this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n  registerWrapper(OriginalText, Text, document.createTextNode(\"\"));\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, \"class\");\n  }\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\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  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalElement = window.Element;\n  var matchesNames = [ \"matches\", \"mozMatchesSelector\", \"msMatchesSelector\", \"webkitMatchesSelector\" ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n  var matchesName = matchesNames[0];\n  var originalMatches = OriginalElement.prototype[matchesName];\n  function invalidateRendererBasedOnAttribute(element, name) {\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot) return;\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name)) renderer.invalidate();\n  }\n  function enqueAttributeChange(element, name, oldValue) {\n    enqueueMutation(element, \"attributes\", {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n  var classListTable = new WeakMap();\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      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n      return newShadowRoot;\n    },\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\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    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    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this, list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n    set className(v) {\n      this.setAttribute(\"class\", v);\n    },\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n    set id(v) {\n      this.setAttribute(\"id\", v);\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  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n  }\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n  registerWrapper(OriginalElement, Element, document.createElementNS(null, \"x\"));\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n  function escapeReplace(c) {\n    switch (c) {\n     case \"&\":\n      return \"&amp;\";\n\n     case \"<\":\n      return \"&lt;\";\n\n     case \">\":\n      return \"&gt;\";\n\n     case '\"':\n      return \"&quot;\";\n\n     case \" \":\n      return \"&nbsp;\";\n    }\n  }\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\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  var voidElements = makeSet([ \"area\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"wbr\" ]);\n  var plaintextParents = makeSet([ \"style\", \"script\", \"xmp\", \"iframe\", \"noembed\", \"noframes\", \"plaintext\", \"noscript\" ]);\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]) return s;\n      return s + getInnerHTML(node) + \"</\" + tagName + \">\";\n\n     case Node.TEXT_NODE:\n      var data = node.data;\n      if (parentNode && plaintextParents[parentNode.localName]) 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  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement) node = node.content;\n    var s = \"\";\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\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  var oldIe = /MSIE/.test(navigator.userAgent);\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n      var removedNodes = snapshotNodeList(this.childNodes);\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);\n      } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n      var addedNodes = snapshotNodeList(this.childNodes);\n      enqueueMutation(this, \"childList\", {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\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    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\n       case \"afterend\":\n        contextElement = this.parentNode;\n        refNode = this.nextSibling;\n        break;\n\n       case \"afterbegin\":\n        contextElement = this;\n        refNode = this.firstChild;\n        break;\n\n       case \"beforeend\":\n        contextElement = this;\n        refNode = null;\n        break;\n\n       default:\n        return;\n      }\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\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  function frag(contextElement, html) {\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  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n  [ \"clientHeight\", \"clientLeft\", \"clientTop\", \"clientWidth\", \"offsetHeight\", \"offsetLeft\", \"offsetTop\", \"offsetWidth\", \"scrollHeight\", \"scrollWidth\" ].forEach(getterRequiresRendering);\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  [ \"scrollLeft\", \"scrollTop\" ].forEach(getterAndSetterRequiresRendering);\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  [ \"getBoundingClientRect\", \"getClientRects\", \"scrollIntoView\" ].forEach(methodRequiresRendering);\n  registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement(\"b\"));\n  scope.wrappers.HTMLElement = HTMLElement;\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\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  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement(\"canvas\"));\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var OriginalHTMLContentElement = window.HTMLContentElement;\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    get select() {\n      return this.getAttribute(\"select\");\n    },\n    set select(value) {\n      this.setAttribute(\"select\", value);\n    },\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === \"select\") this.invalidateShadowRenderer(true);\n    }\n  });\n  if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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 OriginalHTMLFormElement = window.HTMLFormElement;\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      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement(\"form\"));\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement(\"img\"));\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n    }\n    var node = unwrap(document.createElement(\"img\"));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n    if (width !== undefined) node.width = width;\n    if (height !== undefined) node.height = height;\n  }\n  Image.prototype = HTMLImageElement.prototype;\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n  if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView) return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\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  function extractContent(templateElement) {\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  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    }\n  });\n  if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n  if (!OriginalHTMLMediaElement) return;\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement(\"audio\"));\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n  if (!OriginalHTMLAudioElement) return;\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement(\"audio\"));\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n    }\n    var node = unwrap(document.createElement(\"audio\"));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n    node.setAttribute(\"preload\", \"auto\");\n    if (src !== undefined) node.setAttribute(\"src\", src);\n  }\n  Audio.prototype = HTMLAudioElement.prototype;\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n  function trimText(s) {\n    return s.replace(/\\s+/g, \" \").trim();\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  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement(\"option\"));\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n    }\n    var node = unwrap(document.createElement(\"option\"));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n    if (text !== undefined) node.text = text;\n    if (value !== undefined) node.setAttribute(\"value\", value);\n    if (defaultSelected === true) node.setAttribute(\"selected\", \"\");\n    node.selected = selected === true;\n  }\n  Option.prototype = HTMLOptionElement.prototype;\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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 OriginalHTMLSelectElement = window.HTMLSelectElement;\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\") before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n    remove: function(indexOrNode) {\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n      if (typeof indexOrNode === \"object\") indexOrNode = unwrap(indexOrNode);\n      unwrap(this).remove(indexOrNode);\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement(\"select\"));\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLTableElement = window.HTMLTableElement;\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    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\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  registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement(\"table\"));\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\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  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement(\"thead\"));\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\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    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement(\"tr\"));\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n     case \"content\":\n      return new HTMLContentElement(node);\n\n     case \"shadow\":\n      return new HTMLShadowElement(node);\n\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\n(function(scope) {\n  \"use strict\";\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\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  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  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var OriginalSVGUseElement = window.SVGUseElement;\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  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\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  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance) return;\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n    get childNodes() {\n      throw new Error(\"Not implemented\");\n    },\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement(\"canvas\").getContext(\"2d\"));\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  if (!OriginalWebGLRenderingContext) return;\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ? {\n    drawingBufferHeight: null,\n    drawingBufferWidth: null\n  } : {};\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalRange = window.Range;\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  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n  registerWrapper(window.Range, Range, document.createRange());\n  scope.wrappers.Range = Range;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n  var Comment = registerObject(document.createComment(\"\"));\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n    rewrap(node, this);\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n    this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n    getElementById: function(id) {\n      if (spaceCharRe.test(id)) return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n  scope.wrappers.ShadowRoot = ShadowRoot;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var ArraySplice = scope.ArraySplice;\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\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    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n    scope.originalInsertBefore.call(parentNode, newChild, refChild);\n  }\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper);\n    var parentNode = node.parentNode;\n    if (!parentNode) return;\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n    if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n    if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;\n    scope.originalRemoveChild.call(parentNode, node);\n  }\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv) distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\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  var request = oneOf(window, [ \"requestAnimationFrame\", \"mozRequestAnimationFrame\", \"webkitRequestAnimationFrame\", \"setTimeout\" ]);\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n  function renderAllPending() {\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty) continue;\n      renderer.render();\n    }\n    pendingDirtyRenderers = [];\n  }\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\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  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot) return root;\n    return null;\n  }\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n    sync: function(opt_added) {\n      if (this.skip) return;\n      var nodeWrapper = this.node;\n      var newChildren = this.childNodes;\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\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        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper)) remove(wrapper);\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          added.set(newChildWrapper, true);\n          newChildRenderNode.sync(added);\n        }\n        lastIndex += addedCount;\n      }\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n  ShadowRenderer.prototype = {\n    render: function(opt_renderNode) {\n      if (!this.dirty) return;\n      this.invalidateAttributes();\n      var host = this.host;\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer) renderNode.sync();\n      this.dirty = false;\n    },\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer) parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer) return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n    distribution: function(root) {\n      this.resetAllSubtrees(root);\n      this.distributionResolution(root);\n    },\n    resetAll: function(node) {\n      if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);\n      this.resetAllSubtrees(node);\n    },\n    resetAllSubtrees: function(node) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n      if (node.shadowRoot) this.resetAll(node.shadowRoot);\n      if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);\n    },\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        var pool = poolPopulation(shadowHost);\n        var shadowTrees = getShadowTrees(shadowHost);\n        for (var i = 0; i < shadowTrees.length; i++) {\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n          var shadow = getShadowInsertionPoint(shadowTree);\n          if (shadow) {\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              pool = poolPopulation(olderShadowRoot);\n            }\n            for (var j = 0; j < pool.length; j++) {\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n          this.distributionResolution(shadowTree);\n        }\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n    poolDistribution: function(node, pool) {\n      if (node instanceof HTMLShadowElement) return;\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute(\"select\"));\n        var anyDistributed = false;\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node) continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n        if (!anyDistributed) {\n          for (var child = content.firstChild; child; child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n        return;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\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      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\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)) children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n    updateDependentAttributes: function(selector) {\n      if (!selector) return;\n      var attributes = this.attributes;\n      if (/\\.\\w+/.test(selector)) attributes[\"class\"] = true;\n      if (/#\\w+/.test(selector)) attributes[\"id\"] = true;\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n    },\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\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  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement) return node;\n    if (node instanceof HTMLContentElement) return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res) return res;\n    }\n    return null;\n  }\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);\n  }\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n  function resetDestinationInsertionPoints(node) {\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute(\"select\");\n    if (!select) return true;\n    select = select.trim();\n    if (!select) return true;\n    if (!(node instanceof Element)) return false;\n    if (!selectorStartCharRe.test(select)) return false;\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      return false;\n    }\n  }\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;\n  }\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n  function getShadowTrees(host) {\n    var trees = [];\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n  function render(host) {\n    new ShadowRenderer(host).render();\n  }\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n    return false;\n  };\n  HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n  HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    this.invalidateShadowRenderer();\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer) renderer.invalidate();\n  };\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove\n  };\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var elementsWithFormProperty = [ \"HTMLButtonElement\", \"HTMLFieldSetElement\", \"HTMLInputElement\", \"HTMLKeygenElement\", \"HTMLLabelElement\", \"HTMLLegendElement\", \"HTMLObjectElement\", \"HTMLOutputElement\", \"HTMLTextAreaElement\" ];\n  function createWrapperConstructor(name) {\n    if (!window[name]) return;\n    assert(!scope.wrappers[name]);\n    var GeneratedWrapper = function(node) {\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    registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalSelection = window.Selection;\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  registerWrapper(window.Selection, Selection, window.getSelection());\n  scope.wrappers.Selection = Selection;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var implementationTable = new WeakMap();\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  defineWrapGetter(Document, \"documentElement\");\n  defineWrapGetter(Document, \"body\");\n  defineWrapGetter(Document, \"head\");\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  [ \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"getElementById\" ].forEach(wrapMethod);\n  var originalAdoptNode = document.adoptNode;\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot) doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot) doc.adoptNode(oldShadowRoot);\n  }\n  var originalGetSelection = document.getSelection;\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode) 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, \"[name=\" + JSON.stringify(String(name)) + \"]\");\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      if (!prototype) prototype = Object.create(HTMLElement.prototype);\n      if (scope.nativePrototypeTable.get(prototype)) {\n        throw new Error(\"NotSupportedError\");\n      }\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype) break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n      if (!nativePrototype) {\n        throw new Error(\"NotSupportedError\");\n      }\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n      [ \"createdCallback\", \"attachedCallback\", \"detachedCallback\", \"attributeChangedCallback\" ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f) return;\n        newPrototype[name] = function() {\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n      var p = {\n        prototype: newPrototype\n      };\n      if (extendsOption) p.extends = extendsOption;\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      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n      var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);\n      return CustomElementConstructor;\n    };\n    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"registerElement\" ]);\n  }\n  forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ \"appendChild\", \"compareDocumentPosition\", \"contains\", \"getElementsByClassName\", \"getElementsByTagName\", \"getElementsByTagNameNS\", \"insertBefore\", \"querySelector\", \"querySelectorAll\", \"removeChild\", \"replaceChild\" ].concat(matchesNames));\n  forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"adoptNode\", \"importNode\", \"contains\", \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"elementFromPoint\", \"getElementById\", \"getElementsByName\", \"getSelection\" ]);\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation) return implementation;\n      implementation = new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n  registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(\"\"));\n  if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);\n  wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\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  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  wrapImplMethod(DOMImplementation, \"createDocumentType\");\n  wrapImplMethod(DOMImplementation, \"createDocument\");\n  wrapImplMethod(DOMImplementation, \"createHTMLDocument\");\n  forwardImplMethod(DOMImplementation, \"hasFeature\");\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n  forwardMethodsToWrapper([ window.DOMImplementation ], [ \"createDocumentType\", \"createDocument\", \"createHTMLDocument\", \"hasFeature\" ]);\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\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  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);\n    };\n  }\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n  delete window.getComputedStyle;\n  delete window.getDefaultComputedStyle;\n  delete window.getSelection;\n  [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ].forEach(function(name) {\n    OriginalWindow.prototype[name] = function() {\n      var w = wrap(this || window);\n      return w[name].apply(w, arguments);\n    };\n    delete window[name];\n  });\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n    };\n  }\n  registerWrapper(OriginalWindow, Window, window);\n  scope.wrappers.Window = Window;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var unwrap = scope.unwrap;\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n  var OriginalFormData = window.FormData;\n  if (!OriginalFormData) return;\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  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n  scope.wrappers.FormData = FormData;\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var originalSend = XMLHttpRequest.prototype.send;\n  XMLHttpRequest.prototype.send = function(obj) {\n    return originalSend.call(this, unwrapIfNeeded(obj));\n  };\n})(window.ShadowDOMPolyfill);\n\n(function(scope) {\n  \"use strict\";\n  var isWrapperFor = scope.isWrapperFor;\n  var elements = {\n    a: \"HTMLAnchorElement\",\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    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    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  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor) return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n  Object.keys(elements).forEach(overrideConstructor);\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name];\n  });\n})(window.ShadowDOMPolyfill);"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/bower.json",
    "content": "{\n  \"name\": \"webcomponentsjs\",\n  \"main\": \"webcomponents.js\",\n  \"version\": \"0.5.2\",\n  \"homepage\": \"http://webcomponents.org\",\n  \"authors\": [\n    \"The Polymer Authors\"\n  ],\n  \"keywords\": [\n    \"webcomponents\"\n  ],\n  \"license\": \"BSD\",\n  \"ignore\": []\n}"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/build.log",
    "content": "BUILD LOG\n---------\nBuild Time: 2014-12-11T12:45:39-0800\n\nNODEJS INFORMATION\n==================\nnodejs: v0.10.33\ngulp: 3.8.10\ngulp-audit: 1.0.0\ngulp-concat: 2.4.2\ngulp-header: 1.2.2\ngulp-uglify: 1.0.2\nrun-sequence: 1.0.2\nweb-component-tester: 2.0.1\n\nREPO REVISIONS\n==============\nwebcomponentsjs: d83cc676df65dc61db22bca47d33da679391f5a0\n\nBUILD HASHES\n============\nCustomElements.js: b221f7741515b570df70fd1c50b398bb8f731b81\nCustomElements.min.js: 6a55999d9f4895525d35c5248e2f409f176162a6\nHTMLImports.js: 72dd4ea891dc3c5256c569992288eca9f5c5e450\nHTMLImports.min.js: 1677819e83722c7d163a571598d8d36cdc8ae690\nShadowDOM.js: a1cce2304031d5acb440978761b346b98d06e1a4\nShadowDOM.min.js: 9371908d889872eb7e8e320e8877c394eb906732\nwebcomponents-lite.js: 7b6c8fbd7f67a2bd04b797a72e808b16ab54518f\nwebcomponents-lite.min.js: 41b033fa7e52bf612686f222d5a496d48bd2909c\nwebcomponents.js: 523f45c65c94d71543729f7e3d32ec4b7a48ae5b\nwebcomponents.min.js: 645b22d4c22bf6eaf470bc03d819d396661ac439"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/package.json",
    "content": "{\n  \"name\": \"webcomponents.js\",\n  \"version\": \"0.5.1-1\",\n  \"description\": \"webcomponents.js\",\n  \"main\": \"gulpfile.js\",\n  \"directories\": {\n    \"test\": \"tests\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/webcomponents/webcomponentsjs.git\"\n  },\n  \"author\": \"The Polymer Authors\",\n  \"license\": {\n    \"type\": \"BSD-3-Clause\",\n    \"url\": \"http://polymer.github.io/LICENSE.txt\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/webcomponents/webcomponentsjs/issues\"\n  },\n  \"homepage\": \"http://webcomponents.org\",\n  \"devDependencies\": {\n    \"gulp\": \"^3.8.8\",\n    \"gulp-audit\": \"^1.0.0\",\n    \"gulp-concat\": \"^2.4.1\",\n    \"gulp-header\": \"^1.1.1\",\n    \"gulp-uglify\": \"^1.0.1\",\n    \"run-sequence\": \"^1.0.1\",\n    \"web-component-tester\": \"*\"\n  }\n}\n"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/webcomponents-lite.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nwindow.WebComponents = window.WebComponents || {};\n\n(function(scope) {\n  var flags = scope.flags || {};\n  var file = \"webcomponents.js\";\n  var script = document.querySelector('script[src*=\"' + file + '\"]');\n  var flags = {};\n  if (!flags.noOpts) {\n    location.search.slice(1).split(\"&\").forEach(function(o) {\n      o = o.split(\"=\");\n      o[0] && (flags[o[0]] = o[1] || true);\n    });\n    if (script) {\n      for (var i = 0, a; a = script.attributes[i]; i++) {\n        if (a.name !== \"src\") {\n          flags[a.name] = a.value || true;\n        }\n      }\n    }\n    if (flags.log) {\n      var parts = flags.log.split(\",\");\n      flags.log = {};\n      parts.forEach(function(f) {\n        flags.log[f] = true;\n      });\n    } else {\n      flags.log = {};\n    }\n  }\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  if (flags.register) {\n    window.CustomElements = window.CustomElements || {\n      flags: {}\n    };\n    window.CustomElements.flags.register = flags.register;\n  }\n  scope.flags = flags;\n})(WebComponents);\n\nif (typeof WeakMap === \"undefined\") {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n    var WeakMap = function() {\n      this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n    };\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n          value: [ key, value ],\n          writable: true\n        });\n        return this;\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n      },\n      \"delete\": function(key) {\n        var entry = key[this.name];\n        if (!entry || entry[0] !== key) return false;\n        entry[0] = entry[1] = undefined;\n        return true;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n    window.WeakMap = WeakMap;\n  })();\n}\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.HTMLImports = window.HTMLImports || {\n  flags: {}\n};\n\n(function(scope) {\n  var IMPORT_LINK_TYPE = \"import\";\n  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement(\"link\"));\n  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\n  var wrap = function(node) {\n    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n  };\n  var rootDocument = wrap(document);\n  var currentScriptDescriptor = {\n    get: function() {\n      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== \"complete\" ? document.scripts[document.scripts.length - 1] : null);\n      return wrap(script);\n    },\n    configurable: true\n  };\n  Object.defineProperty(document, \"_currentScript\", currentScriptDescriptor);\n  Object.defineProperty(rootDocument, \"_currentScript\", currentScriptDescriptor);\n  var isIE = /Trident|Edge/.test(navigator.userAgent);\n  function whenReady(callback, doc) {\n    doc = doc || rootDocument;\n    whenDocumentReady(function() {\n      watchImportsLoad(callback, doc);\n    }, doc);\n  }\n  var requiredReadyState = isIE ? \"complete\" : \"interactive\";\n  var READY_EVENT = \"readystatechange\";\n  function isDocumentReady(doc) {\n    return doc.readyState === \"complete\" || doc.readyState === requiredReadyState;\n  }\n  function whenDocumentReady(callback, doc) {\n    if (!isDocumentReady(doc)) {\n      var checkReady = function() {\n        if (doc.readyState === \"complete\" || 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  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n  function 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 && callback) {\n        callback();\n      }\n    }\n    function loadedImport(e) {\n      markTargetLoaded(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            target: imp\n          });\n        } else {\n          imp.addEventListener(\"load\", loadedImport);\n          imp.addEventListener(\"error\", loadedImport);\n        }\n      }\n    } else {\n      checkDone();\n    }\n  }\n  function isImportLoaded(link) {\n    return useNative ? link.__loaded || link.import && link.import.readyState !== \"loading\" : link.__importParsed;\n  }\n  if (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, {\n      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    function isImport(element) {\n      return element.localName === \"link\" && element.rel === \"import\";\n    }\n    function handleImport(element) {\n      var loaded = element.import;\n      if (loaded) {\n        markTargetLoaded({\n          target: element\n        });\n      } else {\n        element.addEventListener(\"load\", markTargetLoaded);\n        element.addEventListener(\"error\", markTargetLoaded);\n      }\n    }\n    (function() {\n      if (document.readyState === \"loading\") {\n        var imports = document.querySelectorAll(\"link[rel=import]\");\n        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {\n          handleImport(imp);\n        }\n      }\n    })();\n  }\n  whenReady(function() {\n    HTMLImports.ready = true;\n    HTMLImports.readyTime = new Date().getTime();\n    rootDocument.dispatchEvent(new CustomEvent(\"HTMLImportsLoaded\", {\n      bubbles: true\n    }));\n  });\n  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n  scope.useNative = useNative;\n  scope.rootDocument = rootDocument;\n  scope.whenReady = whenReady;\n  scope.isIE = isIE;\n})(HTMLImports);\n\n(function(scope) {\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n})(HTMLImports);\n\nHTMLImports.addModule(function(scope) {\n  var CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n  var CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n  var 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  scope.path = path;\n});\n\nHTMLImports.addModule(function(scope) {\n  xhr = {\n    async: true,\n    ok: function(request) {\n      return request.status >= 200 && request.status < 300 || request.status === 304 || 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          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = locationHeader.substr(0, 1) === \"/\" ? location.origin + locationHeader : locationHeader;\n          }\n          next.call(nextContext, !xhr.ok(request) && request, 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  scope.xhr = xhr;\n});\n\nHTMLImports.addModule(function(scope) {\n  var xhr = scope.xhr;\n  var flags = scope.flags;\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  Loader.prototype = {\n    addNodes: function(nodes) {\n      this.inflight += nodes.length;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        this.require(n);\n      }\n      this.checkDone();\n    },\n    addNode: function(node) {\n      this.inflight++;\n      this.require(node);\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      elt.__nodeUrl = url;\n      if (!this.dedupe(url, elt)) {\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        this.pending[url].push(elt);\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        this.tail();\n        return true;\n      }\n      this.pending[url] = [ elt ];\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log(\"fetch\", url, elt);\n      if (url.match(/^data:/)) {\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      }\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        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  scope.Loader = Loader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var Observer = function(addCallback) {\n    this.addCallback = addCallback;\n    this.mo = new MutationObserver(this.handler.bind(this));\n  };\n  Observer.prototype = {\n    handler: function(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          this.addedNodes(m.addedNodes);\n        }\n      }\n    },\n    addedNodes: function(nodes) {\n      if (this.addCallback) {\n        this.addCallback(nodes);\n      }\n      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {\n        if (n.children && n.children.length) {\n          this.addedNodes(n.children);\n        }\n      }\n    },\n    observe: function(root) {\n      this.mo.observe(root, {\n        childList: true,\n        subtree: true\n      });\n    }\n  };\n  scope.Observer = Observer;\n});\n\nHTMLImports.addModule(function(scope) {\n  var path = scope.path;\n  var rootDocument = scope.rootDocument;\n  var flags = scope.flags;\n  var isIE = scope.isIE;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = \"link[rel=\" + IMPORT_LINK_TYPE + \"]\";\n  var importParser = {\n    documentSelectors: IMPORT_SELECTOR,\n    importsSelectors: [ IMPORT_SELECTOR, \"link[rel=stylesheet]\", \"style\", \"script:not([type])\", 'script[type=\"text/javascript\"]' ].join(\",\"),\n    map: {\n      link: \"parseLink\",\n      script: \"parseScript\",\n      style: \"parseStyle\"\n    },\n    dynamicElements: [],\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    parseDynamic: function(elt, quiet) {\n      this.dynamicElements.push(elt);\n      if (!quiet) {\n        this.parseNext();\n      }\n    },\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      this.markDynamicParsingComplete(elt);\n      if (elt.__importElement) {\n        elt.__importElement.__importParsed = true;\n        this.markDynamicParsingComplete(elt.__importElement);\n      }\n      this.parsingElement = null;\n      flags.parse && console.log(\"completed\", elt);\n    },\n    markDynamicParsingComplete: function(elt) {\n      var i = this.dynamicElements.indexOf(elt);\n      if (i >= 0) {\n        this.dynamicElements.splice(i, 1);\n      }\n    },\n    parseImport: function(elt) {\n      if (HTMLImports.__importsParsingHook) {\n        HTMLImports.__importsParsingHook(elt);\n      }\n      if (elt.import) {\n        elt.import.__importParsed = true;\n      }\n      this.markParsingComplete(elt);\n      if (elt.__resource && !elt.__error) {\n        elt.dispatchEvent(new CustomEvent(\"load\", {\n          bubbles: false\n        }));\n      } else {\n        elt.dispatchEvent(new CustomEvent(\"error\", {\n          bubbles: false\n        }));\n      }\n      if (elt.__pending) {\n        var fn;\n        while (elt.__pending.length) {\n          fn = elt.__pending.shift();\n          if (fn) {\n            fn({\n              target: elt\n            });\n          }\n        }\n      }\n      this.parseNext();\n    },\n    parseLink: function(linkElt) {\n      if (nodeIsImport(linkElt)) {\n        this.parseImport(linkElt);\n      } else {\n        linkElt.href = linkElt.href;\n        this.parseGeneric(linkElt);\n      }\n    },\n    parseStyle: function(elt) {\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      port.parentNode.insertBefore(elt, port);\n    },\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      if (isIE && elt.localName === \"style\") {\n        var fakeLoad = false;\n        if (elt.textContent.indexOf(\"@import\") == -1) {\n          fakeLoad = true;\n        } else if (elt.sheet) {\n          fakeLoad = true;\n          var csr = elt.sheet.cssRules;\n          var len = csr ? csr.length : 0;\n          for (var i = 0, r; i < len && (r = csr[i]); i++) {\n            if (r.type === CSSRule.IMPORT_RULE) {\n              fakeLoad = fakeLoad && Boolean(r.styleSheet);\n            }\n          }\n        }\n        if (fakeLoad) {\n          elt.dispatchEvent(new CustomEvent(\"load\", {\n            bubbles: false\n          }));\n        }\n      }\n    },\n    parseScript: function(scriptElt) {\n      var script = document.createElement(\"script\");\n      script.__importElement = scriptElt;\n      script.src = scriptElt.src ? scriptElt.src : 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    nextToParse: function() {\n      this._mayParse = [];\n      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());\n    },\n    nextToParseInDoc: function(doc, link) {\n      if (doc && this._mayParse.indexOf(doc) < 0) {\n        this._mayParse.push(doc);\n        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {\n          if (!this.isParsed(n)) {\n            if (this.hasResource(n)) {\n              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n            } else {\n              return;\n            }\n          }\n        }\n      }\n      return link;\n    },\n    nextToParseDynamic: function() {\n      return this.dynamicElements[0];\n    },\n    parseSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;\n    },\n    isParsed: function(node) {\n      return node.__importParsed;\n    },\n    needsDynamicParsing: function(elt) {\n      return this.dynamicElements.indexOf(elt) >= 0;\n    },\n    hasResource: function(node) {\n      if (nodeIsImport(node) && node.import === undefined) {\n        return false;\n      }\n      return true;\n    }\n  };\n  function nodeIsImport(elt) {\n    return elt.localName === \"link\" && elt.rel === IMPORT_LINK_TYPE;\n  }\n  function generateScriptDataUrl(script) {\n    var scriptContent = generateScriptContent(script);\n    return \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(scriptContent);\n  }\n  function generateScriptContent(script) {\n    return script.textContent + generateSourceMapHint(script);\n  }\n  function generateSourceMapHint(script) {\n    var owner = script.ownerDocument;\n    owner.__importedScripts = owner.__importedScripts || 0;\n    var moniker = script.ownerDocument.baseURI;\n    var num = owner.__importedScripts ? \"-\" + owner.__importedScripts : \"\";\n    owner.__importedScripts++;\n    return \"\\n//# sourceURL=\" + moniker + num + \".js\\n\";\n  }\n  function cloneStyle(style) {\n    var clone = style.ownerDocument.createElement(\"style\");\n    clone.textContent = style.textContent;\n    path.resolveUrlsInStyle(clone);\n    return clone;\n  }\n  scope.parser = importParser;\n  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;\n});\n\nHTMLImports.addModule(function(scope) {\n  var flags = scope.flags;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;\n  var rootDocument = scope.rootDocument;\n  var Loader = scope.Loader;\n  var Observer = scope.Observer;\n  var parser = scope.parser;\n  var importer = {\n    documents: {},\n    documentPreloadSelectors: IMPORT_SELECTOR,\n    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(\",\"),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log(\"loaded\", url, elt);\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isImportLink(elt)) {\n        var doc = this.documents[url];\n        if (doc === undefined) {\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            this.bootDocument(doc);\n          }\n          this.documents[url] = doc;\n        }\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observer.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));\n  importer.observer = new Observer();\n  function isImportLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n  function isLinkRel(elt, rel) {\n    return elt.localName === \"link\" && elt.getAttribute(\"rel\") === rel;\n  }\n  function makeDocument(resource, url) {\n    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    doc._URL = url;\n    var base = doc.createElement(\"base\");\n    base.setAttribute(\"href\", url);\n    if (!doc.baseURI) {\n      Object.defineProperty(doc, \"baseURI\", {\n        value: url\n      });\n    }\n    var meta = doc.createElement(\"meta\");\n    meta.setAttribute(\"charset\", \"utf-8\");\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    doc.body.innerHTML = resource;\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\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    Object.defineProperty(document, \"baseURI\", baseURIDescriptor);\n    Object.defineProperty(rootDocument, \"baseURI\", baseURIDescriptor);\n  }\n  scope.importer = importer;\n  scope.importLoader = importLoader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var parser = scope.parser;\n  var importer = scope.importer;\n  var dynamic = {\n    added: function(nodes) {\n      var owner, parsed;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        if (!owner) {\n          owner = n.ownerDocument;\n          parsed = parser.isParsed(owner);\n        }\n        loading = this.shouldLoadNode(n);\n        if (loading) {\n          importer.loadNode(n);\n        }\n        if (this.shouldParseNode(n) && parsed) {\n          parser.parseDynamic(n, loading);\n        }\n      }\n    },\n    shouldLoadNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));\n    },\n    shouldParseNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));\n    }\n  };\n  importer.observer.addCallback = dynamic.added.bind(dynamic);\n  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;\n});\n\n(function(scope) {\n  var initializeModules = scope.initializeModules;\n  var isIE = scope.isIE;\n  if (scope.useNative) {\n    return;\n  }\n  if (isIE && 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  initializeModules();\n  var rootDocument = scope.rootDocument;\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(rootDocument);\n  }\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\" && !window.attachEvent) {\n    bootstrap();\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", bootstrap);\n  }\n})(HTMLImports);\n\nwindow.CustomElements = window.CustomElements || {\n  flags: {}\n};\n\n(function(scope) {\n  var flags = scope.flags;\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n  scope.hasNative = Boolean(document.registerElement);\n  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n})(CustomElements);\n\nCustomElements.addModule(function(scope) {\n  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : \"none\";\n  function forSubtree(node, cb) {\n    findAllElements(node, function(e) {\n      if (cb(e)) {\n        return true;\n      }\n      forRoots(e, cb);\n    });\n    forRoots(node, cb);\n  }\n  function findAllElements(node, find, data) {\n    var e = node.firstElementChild;\n    if (!e) {\n      e = node.firstChild;\n      while (e && e.nodeType !== Node.ELEMENT_NODE) {\n        e = e.nextSibling;\n      }\n    }\n    while (e) {\n      if (find(e, data) !== true) {\n        findAllElements(e, find, data);\n      }\n      e = e.nextElementSibling;\n    }\n    return null;\n  }\n  function forRoots(node, cb) {\n    var root = node.shadowRoot;\n    while (root) {\n      forSubtree(root, cb);\n      root = root.olderShadowRoot;\n    }\n  }\n  var processingDocuments;\n  function forDocumentTree(doc, cb) {\n    processingDocuments = [];\n    _forDocumentTree(doc, cb);\n    processingDocuments = null;\n  }\n  function _forDocumentTree(doc, cb) {\n    doc = wrap(doc);\n    if (processingDocuments.indexOf(doc) >= 0) {\n      return;\n    }\n    processingDocuments.push(doc);\n    var imports = doc.querySelectorAll(\"link[rel=\" + IMPORT_LINK_TYPE + \"]\");\n    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {\n      if (n.import) {\n        _forDocumentTree(n.import, cb);\n      }\n    }\n    cb(doc);\n  }\n  scope.forDocumentTree = forDocumentTree;\n  scope.forSubtree = forSubtree;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  var forSubtree = scope.forSubtree;\n  var forDocumentTree = scope.forDocumentTree;\n  function addedNode(node) {\n    return added(node) || addedSubtree(node);\n  }\n  function added(node) {\n    if (scope.upgrade(node)) {\n      return true;\n    }\n    attached(node);\n  }\n  function addedSubtree(node) {\n    forSubtree(node, function(e) {\n      if (added(e)) {\n        return true;\n      }\n    });\n  }\n  function attachedNode(node) {\n    attached(node);\n    if (inDocument(node)) {\n      forSubtree(node, function(e) {\n        attached(e);\n      });\n    }\n  }\n  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;\n  scope.hasPolyfillMutations = hasPolyfillMutations;\n  var isPendingMutations = false;\n  var pendingMutations = [];\n  function deferMutation(fn) {\n    pendingMutations.push(fn);\n    if (!isPendingMutations) {\n      isPendingMutations = true;\n      setTimeout(takeMutations);\n    }\n  }\n  function takeMutations() {\n    isPendingMutations = false;\n    var $p = pendingMutations;\n    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {\n      p();\n    }\n    pendingMutations = [];\n  }\n  function attached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _attached(element);\n      });\n    } else {\n      _attached(element);\n    }\n  }\n  function _attached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (!element.__attached && inDocument(element)) {\n        element.__attached = true;\n        if (element.attachedCallback) {\n          element.attachedCallback();\n        }\n      }\n    }\n  }\n  function detachedNode(node) {\n    detached(node);\n    forSubtree(node, function(e) {\n      detached(e);\n    });\n  }\n  function detached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _detached(element);\n      });\n    } else {\n      _detached(element);\n    }\n  }\n  function _detached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (element.__attached && !inDocument(element)) {\n        element.__attached = false;\n        if (element.detachedCallback) {\n          element.detachedCallback();\n        }\n      }\n    }\n  }\n  function inDocument(element) {\n    var p = element;\n    var doc = wrap(document);\n    while (p) {\n      if (p == doc) {\n        return true;\n      }\n      p = p.parentNode || p.host;\n    }\n  }\n  function watchShadow(node) {\n    if (node.shadowRoot && !node.shadowRoot.__watched) {\n      flags.dom && console.log(\"watching shadow-root for: \", node.localName);\n      var root = node.shadowRoot;\n      while (root) {\n        observe(root);\n        root = root.olderShadowRoot;\n      }\n    }\n  }\n  function handler(mutations) {\n    if (flags.dom) {\n      var mx = mutations[0];\n      if (mx && mx.type === \"childList\" && mx.addedNodes) {\n        if (mx.addedNodes) {\n          var d = mx.addedNodes[0];\n          while (d && d !== document && !d.host) {\n            d = d.parentNode;\n          }\n          var u = d && (d.URL || d._URL || d.host && d.host.localName) || \"\";\n          u = u.split(\"/?\").shift().split(\"/\").pop();\n        }\n      }\n      console.group(\"mutations (%d) [%s]\", mutations.length, u || \"\");\n    }\n    mutations.forEach(function(mx) {\n      if (mx.type === \"childList\") {\n        forEach(mx.addedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          addedNode(n);\n        });\n        forEach(mx.removedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          detachedNode(n);\n        });\n      }\n    });\n    flags.dom && console.groupEnd();\n  }\n  function takeRecords(node) {\n    node = wrap(node);\n    if (!node) {\n      node = wrap(document);\n    }\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    var observer = node.__observer;\n    if (observer) {\n      handler(observer.takeRecords());\n      takeMutations();\n    }\n  }\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  function observe(inRoot) {\n    if (inRoot.__observer) {\n      return;\n    }\n    var observer = new MutationObserver(handler);\n    observer.observe(inRoot, {\n      childList: true,\n      subtree: true\n    });\n    inRoot.__observer = observer;\n  }\n  function upgradeDocument(doc) {\n    doc = wrap(doc);\n    flags.dom && console.group(\"upgradeDocument: \", doc.baseURI.split(\"/\").pop());\n    addedNode(doc);\n    observe(doc);\n    flags.dom && console.groupEnd();\n  }\n  function upgradeDocumentTree(doc) {\n    forDocumentTree(doc, upgradeDocument);\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  scope.watchShadow = watchShadow;\n  scope.upgradeDocumentTree = upgradeDocumentTree;\n  scope.upgradeSubtree = addedSubtree;\n  scope.upgradeAll = addedNode;\n  scope.attachedNode = attachedNode;\n  scope.takeRecords = takeRecords;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  function upgrade(node) {\n    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\n      var is = node.getAttribute(\"is\");\n      var definition = scope.getRegisteredDefinition(is || node.localName);\n      if (definition) {\n        if (is && definition.tag == node.localName) {\n          return upgradeWithDefinition(node, definition);\n        } else if (!is && !definition.extends) {\n          return upgradeWithDefinition(node, definition);\n        }\n      }\n    }\n  }\n  function upgradeWithDefinition(element, definition) {\n    flags.upgrade && console.group(\"upgrade:\", element.localName);\n    if (definition.is) {\n      element.setAttribute(\"is\", definition.is);\n    }\n    implementPrototype(element, definition);\n    element.__upgraded__ = true;\n    created(element);\n    scope.attachedNode(element);\n    scope.upgradeSubtree(element);\n    flags.upgrade && console.groupEnd();\n    return element;\n  }\n  function implementPrototype(element, definition) {\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n  function customMixin(inTarget, inSrc, inNative) {\n    var used = {};\n    var p = inSrc;\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, Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n  function created(element) {\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n  scope.upgrade = upgrade;\n  scope.upgradeWithDefinition = upgradeWithDefinition;\n  scope.implementPrototype = implementPrototype;\n});\n\nCustomElements.addModule(function(scope) {\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  var upgrade = scope.upgrade;\n  var upgradeWithDefinition = scope.upgradeWithDefinition;\n  var implementPrototype = scope.implementPrototype;\n  var useNative = scope.useNative;\n  function register(name, options) {\n    var definition = options || {};\n    if (!name) {\n      throw new Error(\"document.registerElement: first argument `name` must not be empty\");\n    }\n    if (name.indexOf(\"-\") < 0) {\n      throw new Error(\"document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '\" + String(name) + \"'.\");\n    }\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    if (getRegisteredDefinition(name)) {\n      throw new Error(\"DuplicateDefinitionError: a type with name '\" + String(name) + \"' is already registered\");\n    }\n    if (!definition.prototype) {\n      definition.prototype = Object.create(HTMLElement.prototype);\n    }\n    definition.__name = name.toLowerCase();\n    definition.lifecycle = definition.lifecycle || {};\n    definition.ancestry = ancestry(definition.extends);\n    resolveTagName(definition);\n    resolvePrototypeChain(definition);\n    overrideAttributeApi(definition.prototype);\n    registerDefinition(definition.__name, definition);\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    definition.prototype.constructor = definition.ctor;\n    if (scope.ready) {\n      upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n  function overrideAttributeApi(prototype) {\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  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 && newValue !== oldValue) {\n      this.attributeChangedCallback(name, oldValue, newValue);\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  var reservedTagList = [ \"annotation-xml\", \"color-profile\", \"font-face\", \"font-face-src\", \"font-face-uri\", \"font-face-format\", \"font-face-name\", \"missing-glyph\" ];\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([ extendee ]);\n    }\n    return [];\n  }\n  function resolveTagName(definition) {\n    var baseTag = definition.extends;\n    for (var i = 0, a; a = definition.ancestry[i]; i++) {\n      baseTag = a.is && a.tag;\n    }\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      definition.is = definition.__name;\n    }\n  }\n  function resolvePrototypeChain(definition) {\n    if (!Object.__proto__) {\n      var nativePrototype = HTMLElement.prototype;\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\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      definition.native = nativePrototype;\n    }\n  }\n  function instantiate(definition) {\n    return upgradeWithDefinition(domCreateElement(definition.tag), definition);\n  }\n  var registry = {};\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n  var HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n  function createElementNS(namespace, tag, typeExtension) {\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n  function createElement(tag, typeExtension) {\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n    var element;\n    if (typeExtension) {\n      element = createElement(tag);\n      element.setAttribute(\"is\", typeExtension);\n      return element;\n    }\n    element = domCreateElement(tag);\n    if (tag.indexOf(\"-\") >= 0) {\n      implementPrototype(element, HTMLElement);\n    }\n    return element;\n  }\n  function cloneNode(deep) {\n    var n = domCloneNode.call(this, deep);\n    upgrade(n);\n    return n;\n  }\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n  var domCloneNode = Node.prototype.cloneNode;\n  var isInstance;\n  if (!Object.__proto__ && !useNative) {\n    isInstance = function(obj, ctor) {\n      var p = obj;\n      while (p) {\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  document.registerElement = register;\n  document.createElement = createElement;\n  document.createElementNS = createElementNS;\n  Node.prototype.cloneNode = cloneNode;\n  scope.registry = registry;\n  scope.instanceof = isInstance;\n  scope.reservedTagList = reservedTagList;\n  scope.getRegisteredDefinition = getRegisteredDefinition;\n  document.register = document.registerElement;\n});\n\n(function(scope) {\n  var useNative = scope.useNative;\n  var initializeModules = scope.initializeModules;\n  var isIE11OrOlder = /Trident/.test(navigator.userAgent);\n  if (useNative) {\n    var nop = function() {};\n    scope.watchShadow = nop;\n    scope.upgrade = nop;\n    scope.upgradeAll = nop;\n    scope.upgradeDocumentTree = nop;\n    scope.upgradeSubtree = nop;\n    scope.takeRecords = nop;\n    scope.instanceof = function(obj, base) {\n      return obj instanceof base;\n    };\n  } else {\n    initializeModules();\n  }\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  if (!window.wrap) {\n    if (window.ShadowDOMPolyfill) {\n      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n    } else {\n      window.wrap = window.unwrap = function(node) {\n        return node;\n      };\n    }\n  }\n  function bootstrap() {\n    upgradeDocumentTree(wrap(document));\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        upgradeDocumentTree(wrap(elt.import));\n      };\n    }\n    CustomElements.ready = true;\n    setTimeout(function() {\n      CustomElements.readyTime = Date.now();\n      if (window.HTMLImports) {\n        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n      }\n      document.dispatchEvent(new CustomEvent(\"WebComponentsReady\", {\n        bubbles: true\n      }));\n    });\n  }\n  if (isIE11OrOlder && 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  if (document.readyState === \"complete\" || scope.flags.eager) {\n    bootstrap();\n  } else if (document.readyState === \"interactive\" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {\n    bootstrap();\n  } else {\n    var loadEvent = window.HTMLImports && !HTMLImports.ready ? \"HTMLImportsLoaded\" : \"DOMContentLoaded\";\n    window.addEventListener(loadEvent, bootstrap);\n  }\n})(window.CustomElements);\n\nif (typeof HTMLTemplateElement === \"undefined\") {\n  (function() {\n    var TEMPLATE_TAG = \"template\";\n    HTMLTemplateElement = function() {};\n    HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n    HTMLTemplateElement.decorate = function(template) {\n      if (!template.content) {\n        template.content = template.ownerDocument.createDocumentFragment();\n        var child;\n        while (child = template.firstChild) {\n          template.content.appendChild(child);\n        }\n      }\n    };\n    HTMLTemplateElement.bootstrap = function(doc) {\n      var templates = doc.querySelectorAll(TEMPLATE_TAG);\n      for (var i = 0, l = templates.length, t; i < l && (t = templates[i]); i++) {\n        HTMLTemplateElement.decorate(t);\n      }\n    };\n    addEventListener(\"DOMContentLoaded\", function() {\n      HTMLTemplateElement.bootstrap(document);\n    });\n  })();\n}\n\n(function(scope) {\n  var style = document.createElement(\"style\");\n  style.textContent = \"\" + \"body {\" + \"transition: opacity ease-in 0.2s;\" + \" } \\n\" + \"body[unresolved] {\" + \"opacity: 0; display: block; overflow: hidden; position: relative;\" + \" } \\n\";\n  var head = document.querySelector(\"head\");\n  head.insertBefore(style, head.firstChild);\n})(window.WebComponents);"
  },
  {
    "path": "src/mui/bower_components/webcomponentsjs/webcomponents.js",
    "content": "/**\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 */\n// @version 0.5.1-1\nwindow.WebComponents = window.WebComponents || {};\n\n(function(scope) {\n  var flags = scope.flags || {};\n  var file = \"webcomponents.js\";\n  var script = document.querySelector('script[src*=\"' + file + '\"]');\n  var flags = {};\n  if (!flags.noOpts) {\n    location.search.slice(1).split(\"&\").forEach(function(o) {\n      o = o.split(\"=\");\n      o[0] && (flags[o[0]] = o[1] || true);\n    });\n    if (script) {\n      for (var i = 0, a; a = script.attributes[i]; i++) {\n        if (a.name !== \"src\") {\n          flags[a.name] = a.value || true;\n        }\n      }\n    }\n    if (flags.log) {\n      var parts = flags.log.split(\",\");\n      flags.log = {};\n      parts.forEach(function(f) {\n        flags.log[f] = true;\n      });\n    } else {\n      flags.log = {};\n    }\n  }\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  if (flags.register) {\n    window.CustomElements = window.CustomElements || {\n      flags: {}\n    };\n    window.CustomElements.flags.register = flags.register;\n  }\n  scope.flags = flags;\n})(WebComponents);\n\nif (WebComponents.flags.shadow) {\n  if (typeof WeakMap === \"undefined\") {\n    (function() {\n      var defineProperty = Object.defineProperty;\n      var counter = Date.now() % 1e9;\n      var WeakMap = function() {\n        this.name = \"__st\" + (Math.random() * 1e9 >>> 0) + (counter++ + \"__\");\n      };\n      WeakMap.prototype = {\n        set: function(key, value) {\n          var entry = key[this.name];\n          if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {\n            value: [ key, value ],\n            writable: true\n          });\n          return this;\n        },\n        get: function(key) {\n          var entry;\n          return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n        },\n        \"delete\": function(key) {\n          var entry = key[this.name];\n          if (!entry || entry[0] !== key) return false;\n          entry[0] = entry[1] = undefined;\n          return true;\n        },\n        has: function(key) {\n          var entry = key[this.name];\n          if (!entry) return false;\n          return entry[0] === key;\n        }\n      };\n      window.WeakMap = WeakMap;\n    })();\n  }\n  window.ShadowDOMPolyfill = {};\n  (function(scope) {\n    \"use strict\";\n    var constructorTable = new WeakMap();\n    var nativePrototypeTable = new WeakMap();\n    var wrappers = Object.create(null);\n    function detectEval() {\n      if (typeof chrome !== \"undefined\" && chrome.app && chrome.app.runtime) {\n        return false;\n      }\n      if (navigator.getDeviceStorage) {\n        return false;\n      }\n      try {\n        var f = new Function(\"return true;\");\n        return f();\n      } catch (ex) {\n        return false;\n      }\n    }\n    var hasEval = detectEval();\n    function assert(b) {\n      if (!b) throw new Error(\"Assertion failed\");\n    }\n    var defineProperty = Object.defineProperty;\n    var getOwnPropertyNames = Object.getOwnPropertyNames;\n    var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\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    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    function oneOf(object, propertyNames) {\n      for (var i = 0; i < propertyNames.length; i++) {\n        if (propertyNames[i] in object) return propertyNames[i];\n      }\n    }\n    var nonEnumerableDataDescriptor = {\n      value: undefined,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    };\n    function defineNonEnumerableDataProperty(object, name, value) {\n      nonEnumerableDataDescriptor.value = value;\n      defineProperty(object, name, nonEnumerableDataDescriptor);\n    }\n    getOwnPropertyNames(window);\n    function getWrapperConstructor(node) {\n      var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n      var wrapperConstructor = constructorTable.get(nativePrototype);\n      if (wrapperConstructor) return wrapperConstructor;\n      var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n      var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n      registerInternal(nativePrototype, GeneratedWrapper, node);\n      return GeneratedWrapper;\n    }\n    function addForwardingProperties(nativePrototype, wrapperPrototype) {\n      installProperty(nativePrototype, wrapperPrototype, true);\n    }\n    function registerInstanceProperties(wrapperPrototype, instanceObject) {\n      installProperty(instanceObject, wrapperPrototype, false);\n    }\n    var isFirefox = /Firefox/.test(navigator.userAgent);\n    var dummyDescriptor = {\n      get: function() {},\n      set: function(v) {},\n      configurable: true,\n      enumerable: true\n    };\n    function isEventHandlerName(name) {\n      return /^on[a-z]+$/.test(name);\n    }\n    function isIdentifierName(name) {\n      return /^\\w[a-zA-Z_0-9]*$/.test(name);\n    }\n    function getGetter(name) {\n      return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name) : function() {\n        return this.__impl4cf1e782hg__[name];\n      };\n    }\n    function getSetter(name) {\n      return hasEval && isIdentifierName(name) ? new Function(\"v\", \"this.__impl4cf1e782hg__.\" + name + \" = v\") : function(v) {\n        this.__impl4cf1e782hg__[name] = v;\n      };\n    }\n    function getMethod(name) {\n      return hasEval && isIdentifierName(name) ? new Function(\"return this.__impl4cf1e782hg__.\" + name + \".apply(this.__impl4cf1e782hg__, arguments)\") : function() {\n        return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);\n      };\n    }\n    function getDescriptor(source, name) {\n      try {\n        return Object.getOwnPropertyDescriptor(source, name);\n      } catch (ex) {\n        return dummyDescriptor;\n      }\n    }\n    var isBrokenSafari = function() {\n      var descr = Object.getOwnPropertyDescriptor(Node.prototype, \"nodeType\");\n      return descr && !descr.get && !descr.set;\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_\") continue;\n        if (name in target) continue;\n        if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;\n        if (isFirefox) {\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        var isEvent = isEventHandlerName(name);\n        if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);\n        if (descriptor.writable || descriptor.set || isBrokenSafari) {\n          if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);\n        }\n        defineProperty(target, name, {\n          get: getter,\n          set: setter,\n          configurable: descriptor.configurable,\n          enumerable: descriptor.enumerable\n        });\n      }\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    function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n      var wrapperPrototype = wrapperConstructor.prototype;\n      assert(constructorTable.get(nativePrototype) === undefined);\n      constructorTable.set(nativePrototype, wrapperConstructor);\n      nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n      addForwardingProperties(nativePrototype, wrapperPrototype);\n      if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);\n      defineNonEnumerableDataProperty(wrapperPrototype, \"constructor\", wrapperConstructor);\n      wrapperConstructor.prototype = wrapperPrototype;\n    }\n    function isWrapperFor(wrapperConstructor, nativeConstructor) {\n      return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;\n    }\n    function registerObject(object) {\n      var nativePrototype = Object.getPrototypeOf(object);\n      var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n      var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n      registerInternal(nativePrototype, GeneratedWrapper, object);\n      return GeneratedWrapper;\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      return GeneratedWrapper;\n    }\n    function isWrapper(object) {\n      return object && object.__impl4cf1e782hg__;\n    }\n    function isNative(object) {\n      return !isWrapper(object);\n    }\n    function wrap(impl) {\n      if (impl === null) return null;\n      assert(isNative(impl));\n      return impl.__wrapper8e3dd93a60__ || (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n    }\n    function unwrap(wrapper) {\n      if (wrapper === null) return null;\n      assert(isWrapper(wrapper));\n      return wrapper.__impl4cf1e782hg__;\n    }\n    function unsafeUnwrap(wrapper) {\n      return wrapper.__impl4cf1e782hg__;\n    }\n    function setWrapper(impl, wrapper) {\n      wrapper.__impl4cf1e782hg__ = impl;\n      impl.__wrapper8e3dd93a60__ = wrapper;\n    }\n    function unwrapIfNeeded(object) {\n      return object && isWrapper(object) ? unwrap(object) : object;\n    }\n    function wrapIfNeeded(object) {\n      return object && !isWrapper(object) ? wrap(object) : object;\n    }\n    function rewrap(node, wrapper) {\n      if (wrapper === null) return;\n      assert(isNative(node));\n      assert(wrapper === undefined || isWrapper(wrapper));\n      node.__wrapper8e3dd93a60__ = wrapper;\n    }\n    var getterDescriptor = {\n      get: undefined,\n      configurable: true,\n      enumerable: true\n    };\n    function defineGetter(constructor, name, getter) {\n      getterDescriptor.get = getter;\n      defineProperty(constructor.prototype, name, getterDescriptor);\n    }\n    function defineWrapGetter(constructor, name) {\n      defineGetter(constructor, name, function() {\n        return wrap(this.__impl4cf1e782hg__[name]);\n      });\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    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  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    function newSplice(index, removed, addedCount) {\n      return {\n        index: index,\n        removed: removed,\n        addedCount: addedCount\n      };\n    }\n    var EDIT_LEAVE = 0;\n    var EDIT_UPDATE = 1;\n    var EDIT_ADD = 2;\n    var EDIT_DELETE = 3;\n    function ArraySplice() {}\n    ArraySplice.prototype = {\n      calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n        var rowCount = oldEnd - oldStart + 1;\n        var columnCount = currentEnd - currentStart + 1;\n        var distances = new Array(rowCount);\n        for (var i = 0; i < rowCount; i++) {\n          distances[i] = new Array(columnCount);\n          distances[i][0] = i;\n        }\n        for (var j = 0; j < columnCount; j++) distances[0][j] = j;\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])) distances[i][j] = distances[i - 1][j - 1]; 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        return distances;\n      },\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          var min;\n          if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;\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        edits.reverse();\n        return edits;\n      },\n      calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {\n        var prefixCount = 0;\n        var suffixCount = 0;\n        var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n        if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);\n        if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n        currentStart += prefixCount;\n        oldStart += prefixCount;\n        currentEnd -= suffixCount;\n        oldEnd -= suffixCount;\n        if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];\n        if (currentStart == currentEnd) {\n          var splice = newSplice(currentStart, [], 0);\n          while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);\n          return [ splice ];\n        } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n        var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));\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            index++;\n            oldIndex++;\n            break;\n\n           case EDIT_UPDATE:\n            if (!splice) splice = newSplice(index, [], 0);\n            splice.addedCount++;\n            index++;\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n\n           case EDIT_ADD:\n            if (!splice) splice = newSplice(index, [], 0);\n            splice.addedCount++;\n            index++;\n            break;\n\n           case EDIT_DELETE:\n            if (!splice) splice = newSplice(index, [], 0);\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          }\n        }\n        if (splice) {\n          splices.push(splice);\n        }\n        return splices;\n      },\n      sharedPrefix: function(current, old, searchLength) {\n        for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;\n        return searchLength;\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])) count++;\n        return count;\n      },\n      calculateSplices: function(current, previous) {\n        return this.calcSplices(current, 0, current.length, previous, 0, previous.length);\n      },\n      equals: function(currentValue, previousValue) {\n        return currentValue === previousValue;\n      }\n    };\n    scope.ArraySplice = ArraySplice;\n  })(window.ShadowDOMPolyfill);\n  (function(context) {\n    \"use strict\";\n    var OriginalMutationObserver = window.MutationObserver;\n    var callbacks = [];\n    var pending = false;\n    var timerFunc;\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    if (OriginalMutationObserver) {\n      var counter = 1;\n      var observer = new OriginalMutationObserver(handle);\n      var textNode = document.createTextNode(counter);\n      observer.observe(textNode, {\n        characterData: true\n      });\n      timerFunc = function() {\n        counter = (counter + 1) % 2;\n        textNode.data = counter;\n      };\n    } else {\n      timerFunc = window.setTimeout;\n    }\n    function setEndOfMicrotask(func) {\n      callbacks.push(func);\n      if (pending) return;\n      pending = true;\n      timerFunc(handle, 0);\n    }\n    context.setEndOfMicrotask = setEndOfMicrotask;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var setEndOfMicrotask = scope.setEndOfMicrotask;\n    var wrapIfNeeded = scope.wrapIfNeeded;\n    var wrappers = scope.wrappers;\n    var registrationsTable = new WeakMap();\n    var globalMutationObservers = [];\n    var isScheduled = false;\n    function scheduleCallback(observer) {\n      if (observer.scheduled_) return;\n      observer.scheduled_ = true;\n      globalMutationObservers.push(observer);\n      if (isScheduled) return;\n      setEndOfMicrotask(notifyObservers);\n      isScheduled = true;\n    }\n    function notifyObservers() {\n      isScheduled = false;\n      while (globalMutationObservers.length) {\n        var notifyList = globalMutationObservers;\n        globalMutationObservers = [];\n        notifyList.sort(function(x, y) {\n          return x.uid_ - y.uid_;\n        });\n        for (var i = 0; i < notifyList.length; i++) {\n          var mo = notifyList[i];\n          mo.scheduled_ = false;\n          var queue = mo.takeRecords();\n          removeTransientObserversFor(mo);\n          if (queue.length) {\n            mo.callback_(queue, mo);\n          }\n        }\n      }\n    }\n    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    function registerTransientObservers(ancestor, node) {\n      for (;ancestor; ancestor = ancestor.parentNode) {\n        var registrations = registrationsTable.get(ancestor);\n        if (!registrations) continue;\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.options.subtree) registration.addTransientObserver(node);\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) return;\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          if (registration.observer === observer) registration.removeTransientObservers();\n        }\n      }\n    }\n    function enqueueMutation(target, type, data) {\n      var interestedObservers = Object.create(null);\n      var associatedStrings = Object.create(null);\n      for (var node = target; node; node = node.parentNode) {\n        var registrations = registrationsTable.get(node);\n        if (!registrations) continue;\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          if (type === \"attributes\" && !options.attributes) continue;\n          if (type === \"attributes\" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {\n            continue;\n          }\n          if (type === \"characterData\" && !options.characterData) continue;\n          if (type === \"childList\" && !options.childList) continue;\n          var observer = registration.observer;\n          interestedObservers[observer.uid_] = observer;\n          if (type === \"attributes\" && options.attributeOldValue || type === \"characterData\" && options.characterDataOldValue) {\n            associatedStrings[observer.uid_] = data.oldValue;\n          }\n        }\n      }\n      for (var uid in interestedObservers) {\n        var observer = interestedObservers[uid];\n        var record = new MutationRecord(type, target);\n        if (\"name\" in data && \"namespace\" in data) {\n          record.attributeName = data.name;\n          record.attributeNamespace = data.namespace;\n        }\n        if (data.addedNodes) record.addedNodes = data.addedNodes;\n        if (data.removedNodes) record.removedNodes = data.removedNodes;\n        if (data.previousSibling) record.previousSibling = data.previousSibling;\n        if (data.nextSibling) record.nextSibling = data.nextSibling;\n        if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];\n        scheduleCallback(observer);\n        observer.records_.push(record);\n      }\n    }\n    var slice = Array.prototype.slice;\n    function MutationObserverOptions(options) {\n      this.childList = !!options.childList;\n      this.subtree = !!options.subtree;\n      if (!(\"attributes\" in options) && (\"attributeOldValue\" in options || \"attributeFilter\" in options)) {\n        this.attributes = true;\n      } else {\n        this.attributes = !!options.attributes;\n      }\n      if (\"characterDataOldValue\" in options && !(\"characterData\" in options)) this.characterData = true; else this.characterData = !!options.characterData;\n      if (!this.attributes && (options.attributeOldValue || \"attributeFilter\" in options) || !this.characterData && options.characterDataOldValue) {\n        throw new TypeError();\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 || 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    var uidCounter = 0;\n    function MutationObserver(callback) {\n      this.callback_ = callback;\n      this.nodes_ = [];\n      this.records_ = [];\n      this.uid_ = ++uidCounter;\n      this.scheduled_ = false;\n    }\n    MutationObserver.prototype = {\n      constructor: MutationObserver,\n      observe: function(target, options) {\n        target = wrapIfNeeded(target);\n        var newOptions = new MutationObserverOptions(options);\n        var registration;\n        var registrations = registrationsTable.get(target);\n        if (!registrations) registrationsTable.set(target, registrations = []);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i].observer === this) {\n            registration = registrations[i];\n            registration.removeTransientObservers();\n            registration.options = newOptions;\n          }\n        }\n        if (!registration) {\n          registration = new Registration(this, target, newOptions);\n          registrations.push(registration);\n          this.nodes_.push(target);\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              registrations.splice(i, 1);\n              break;\n            }\n          }\n        }, this);\n        this.records_ = [];\n      },\n      takeRecords: function() {\n        var copyOfRecords = this.records_;\n        this.records_ = [];\n        return copyOfRecords;\n      }\n    };\n    function Registration(observer, target, options) {\n      this.observer = observer;\n      this.target = target;\n      this.options = options;\n      this.transientObservedNodes = [];\n    }\n    Registration.prototype = {\n      addTransientObserver: function(node) {\n        if (node === this.target) return;\n        scheduleCallback(this.observer);\n        this.transientObservedNodes.push(node);\n        var registrations = registrationsTable.get(node);\n        if (!registrations) registrationsTable.set(node, registrations = []);\n        registrations.push(this);\n      },\n      removeTransientObservers: function() {\n        var transientObservedNodes = this.transientObservedNodes;\n        this.transientObservedNodes = [];\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              break;\n            }\n          }\n        }\n      }\n    };\n    scope.enqueueMutation = enqueueMutation;\n    scope.registerTransientObservers = registerTransientObservers;\n    scope.wrappers.MutationObserver = MutationObserver;\n    scope.wrappers.MutationRecord = MutationRecord;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    function TreeScope(root, parent) {\n      this.root = root;\n      this.parent = parent;\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      contains: function(treeScope) {\n        for (;treeScope; treeScope = treeScope.parent) {\n          if (treeScope === this) return true;\n        }\n        return false;\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    function getTreeScope(node) {\n      if (node instanceof scope.wrappers.Window) {\n        debugger;\n      }\n      if (node.treeScope_) return node.treeScope_;\n      var parent = node.parentNode;\n      var treeScope;\n      if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);\n      return node.treeScope_ = treeScope;\n    }\n    scope.TreeScope = TreeScope;\n    scope.getTreeScope = getTreeScope;\n    scope.setTreeScope = setTreeScope;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    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    function isShadowRoot(node) {\n      return node instanceof wrappers.ShadowRoot;\n    }\n    function rootOfNode(node) {\n      return getTreeScope(node).root;\n    }\n    function getEventPath(node, event) {\n      var path = [];\n      var current = node;\n      path.push(current);\n      while (current) {\n        var destinationInsertionPoints = getDestinationInsertionPoints(current);\n        if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n          for (var i = 0; i < destinationInsertionPoints.length; i++) {\n            var insertionPoint = destinationInsertionPoints[i];\n            if (isShadowInsertionPoint(insertionPoint)) {\n              var shadowRoot = rootOfNode(insertionPoint);\n              var olderShadowRoot = shadowRoot.olderShadowRoot;\n              if (olderShadowRoot) path.push(olderShadowRoot);\n            }\n            path.push(insertionPoint);\n          }\n          current = destinationInsertionPoints[destinationInsertionPoints.length - 1];\n        } else {\n          if (isShadowRoot(current)) {\n            if (inSameTree(node, current) && eventMustBeStopped(event)) {\n              break;\n            }\n            current = current.host;\n            path.push(current);\n          } else {\n            current = current.parentNode;\n            if (current) path.push(current);\n          }\n        }\n      }\n      return path;\n    }\n    function eventMustBeStopped(event) {\n      if (!event) return false;\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    function isShadowInsertionPoint(node) {\n      return node instanceof HTMLShadowElement;\n    }\n    function getDestinationInsertionPoints(node) {\n      return scope.getDestinationInsertionPoints(node);\n    }\n    function eventRetargetting(path, currentTarget) {\n      if (path.length === 0) return currentTarget;\n      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n      var currentTargetTree = getTreeScope(currentTarget);\n      var originalTarget = path[0];\n      var originalTargetTree = getTreeScope(originalTarget);\n      var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n      for (var i = 0; i < path.length; i++) {\n        var node = path[i];\n        if (getTreeScope(node) === relativeTargetTree) return node;\n      }\n      return path[path.length - 1];\n    }\n    function getTreeScopeAncestors(treeScope) {\n      var ancestors = [];\n      for (;treeScope; treeScope = treeScope.parent) {\n        ancestors.push(treeScope);\n      }\n      return ancestors;\n    }\n    function lowestCommonInclusiveAncestor(tsA, tsB) {\n      var ancestorsA = getTreeScopeAncestors(tsA);\n      var ancestorsB = getTreeScopeAncestors(tsB);\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) result = a; else break;\n      }\n      return result;\n    }\n    function getTreeScopeRoot(ts) {\n      if (!ts.parent) return ts;\n      return getTreeScopeRoot(ts.parent);\n    }\n    function relatedTargetResolution(event, currentTarget, relatedTarget) {\n      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;\n      var currentTargetTree = getTreeScope(currentTarget);\n      var relatedTargetTree = getTreeScope(relatedTarget);\n      var relatedTargetEventPath = getEventPath(relatedTarget, event);\n      var lowestCommonAncestorTree;\n      var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n      if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;\n      for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {\n        var adjustedRelatedTarget;\n        for (var i = 0; i < relatedTargetEventPath.length; i++) {\n          var node = relatedTargetEventPath[i];\n          if (getTreeScope(node) === commonAncestorTree) return node;\n        }\n      }\n      return null;\n    }\n    function inSameTree(a, b) {\n      return getTreeScope(a) === getTreeScope(b);\n    }\n    var NONE = 0;\n    var CAPTURING_PHASE = 1;\n    var AT_TARGET = 2;\n    var BUBBLING_PHASE = 3;\n    var pendingError;\n    function dispatchOriginalEvent(originalEvent) {\n      if (handledEventsTable.get(originalEvent)) 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    function isLoadLikeEvent(event) {\n      switch (event.type) {\n       case \"load\":\n       case \"beforeunload\":\n       case \"unload\":\n        return true;\n      }\n      return false;\n    }\n    function dispatchEvent(event, originalWrapperTarget) {\n      if (currentlyDispatchingEvents.get(event)) throw new Error(\"InvalidStateError\");\n      currentlyDispatchingEvents.set(event, true);\n      scope.renderAllPending();\n      var eventPath;\n      var overrideTarget;\n      var win;\n      if (isLoadLikeEvent(event) && !event.bubbles) {\n        var doc = originalWrapperTarget;\n        if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n          overrideTarget = doc;\n          eventPath = [];\n        }\n      }\n      if (!eventPath) {\n        if (originalWrapperTarget instanceof wrappers.Window) {\n          win = originalWrapperTarget;\n          eventPath = [];\n        } else {\n          eventPath = getEventPath(originalWrapperTarget, event);\n          if (!isLoadLikeEvent(event)) {\n            var doc = eventPath[eventPath.length - 1];\n            if (doc instanceof wrappers.Document) win = doc.defaultView;\n          }\n        }\n      }\n      eventPathTable.set(event, eventPath);\n      if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n        if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n          dispatchBubbling(event, eventPath, win, overrideTarget);\n        }\n      }\n      eventPhaseTable.set(event, NONE);\n      currentTargetTable.delete(event, null);\n      currentlyDispatchingEvents.delete(event);\n      return event.defaultPrevented;\n    }\n    function dispatchCapturing(event, eventPath, win, overrideTarget) {\n      var phase = CAPTURING_PHASE;\n      if (win) {\n        if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;\n      }\n      for (var i = eventPath.length - 1; i > 0; i--) {\n        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;\n      }\n      return true;\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    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)) return;\n      }\n      if (win && eventPath.length > 0) {\n        invoke(win, event, phase, eventPath, overrideTarget);\n      }\n    }\n    function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n      var listeners = listenersTable.get(currentTarget);\n      if (!listeners) return true;\n      var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n      if (target === currentTarget) {\n        if (phase === CAPTURING_PHASE) return true;\n        if (phase === BUBBLING_PHASE) phase = AT_TARGET;\n      } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n        return true;\n      }\n      if (\"relatedTarget\" in event) {\n        var originalEvent = unwrap(event);\n        var unwrappedRelatedTarget = originalEvent.relatedTarget;\n        if (unwrappedRelatedTarget) {\n          if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {\n            var relatedTarget = wrap(unwrappedRelatedTarget);\n            var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);\n            if (adjusted === target) return true;\n          } else {\n            adjusted = null;\n          }\n          relatedTargetTable.set(event, adjusted);\n        }\n      }\n      eventPhaseTable.set(event, phase);\n      var type = event.type;\n      var anyRemoved = false;\n      targetTable.set(event, target);\n      currentTargetTable.set(event, currentTarget);\n      listeners.depth++;\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        if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {\n          continue;\n        }\n        try {\n          if (typeof listener.handler === \"function\") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);\n          if (stopImmediatePropagationTable.get(event)) return false;\n        } catch (ex) {\n          if (!pendingError) pendingError = ex;\n        }\n      }\n      listeners.depth--;\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) listeners.push(copy[i]);\n        }\n      }\n      return !stopPropagationTable.get(event);\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 && this.capture === that.capture;\n      },\n      get removed() {\n        return this.handler === null;\n      },\n      remove: function() {\n        this.handler = null;\n      }\n    };\n    var OriginalEvent = window.Event;\n    OriginalEvent.prototype.polymerBlackList_ = {\n      returnValue: true,\n      keyLocation: true\n    };\n    function Event(type, options) {\n      if (type instanceof OriginalEvent) {\n        var impl = type;\n        if (!OriginalBeforeUnloadEvent && impl.type === \"beforeunload\" && !(this instanceof BeforeUnloadEvent)) {\n          return new BeforeUnloadEvent(impl);\n        }\n        setWrapper(impl, this);\n      } else {\n        return wrap(constructEvent(OriginalEvent, \"Event\", type, options));\n      }\n    }\n    Event.prototype = {\n      get target() {\n        return targetTable.get(this);\n      },\n      get currentTarget() {\n        return currentTargetTable.get(this);\n      },\n      get eventPhase() {\n        return eventPhaseTable.get(this);\n      },\n      get path() {\n        var eventPath = eventPathTable.get(this);\n        if (!eventPath) return [];\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    function unwrapOptions(options) {\n      if (!options || !options.relatedTarget) return options;\n      return Object.create(options, {\n        relatedTarget: {\n          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) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));\n      };\n      GenericEvent.prototype = Object.create(SuperEvent.prototype);\n      if (prototype) mixin(GenericEvent.prototype, prototype);\n      if (OriginalEvent) {\n        try {\n          registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent(\"temp\"));\n        } catch (ex) {\n          registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));\n        }\n      }\n      return GenericEvent;\n    }\n    var UIEvent = registerGenericEvent(\"UIEvent\", Event);\n    var CustomEvent = registerGenericEvent(\"CustomEvent\", Event);\n    var relatedTargetProto = {\n      get relatedTarget() {\n        var relatedTarget = relatedTargetTable.get(this);\n        if (relatedTarget !== undefined) return relatedTarget;\n        return wrap(unwrap(this).relatedTarget);\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    var mouseEventProto = mixin({\n      initMouseEvent: getInitFunction(\"initMouseEvent\", 14)\n    }, relatedTargetProto);\n    var focusEventProto = mixin({\n      initFocusEvent: getInitFunction(\"initFocusEvent\", 5)\n    }, relatedTargetProto);\n    var MouseEvent = registerGenericEvent(\"MouseEvent\", UIEvent, mouseEventProto);\n    var FocusEvent = registerGenericEvent(\"FocusEvent\", UIEvent, focusEventProto);\n    var defaultInitDicts = Object.create(null);\n    var supportsEventConstructors = function() {\n      try {\n        new window.FocusEvent(\"focus\");\n      } catch (ex) {\n        return false;\n      }\n      return true;\n    }();\n    function constructEvent(OriginalEvent, name, type, options) {\n      if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));\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 ? options[key] : defaultDict[key];\n        if (key === \"relatedTarget\") v = unwrap(v);\n        args.push(v);\n      });\n      event[\"init\" + name].apply(event, args);\n      return event;\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        defaultInitDicts[name] = initDict;\n      };\n      configureEventConstructor(\"Event\", {\n        bubbles: false,\n        cancelable: false\n      });\n      configureEventConstructor(\"CustomEvent\", {\n        detail: null\n      }, \"Event\");\n      configureEventConstructor(\"UIEvent\", {\n        view: null,\n        detail: 0\n      }, \"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\", {\n        relatedTarget: null\n      }, \"UIEvent\");\n    }\n    var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\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    if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n    function isValidListener(fun) {\n      if (typeof fun === \"function\") return true;\n      return fun && fun.handleEvent;\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    var OriginalEventTarget = window.EventTarget;\n    function EventTarget(impl) {\n      setWrapper(impl, this);\n    }\n    var methodNames = [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ];\n    [ Node, Window ].forEach(function(constructor) {\n      var p = constructor.prototype;\n      methodNames.forEach(function(name) {\n        Object.defineProperty(p, name + \"_\", {\n          value: p[name]\n        });\n      });\n    });\n    function getTargetToListenAt(wrapper) {\n      if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;\n      return unwrap(wrapper);\n    }\n    EventTarget.prototype = {\n      addEventListener: function(type, fun, capture) {\n        if (!isValidListener(fun) || isMutationEvent(type)) return;\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          for (var i = 0; i < listeners.length; i++) {\n            if (listener.equals(listeners[i])) return;\n          }\n        }\n        listeners.push(listener);\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) 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        if (found && count === 1) {\n          var target = getTargetToListenAt(this);\n          target.removeEventListener_(type, dispatchOriginalEvent, true);\n        }\n      },\n      dispatchEvent: function(event) {\n        var nativeEvent = unwrap(event);\n        var eventType = nativeEvent.type;\n        handledEventsTable.set(nativeEvent, false);\n        scope.renderAllPending();\n        var tempListener;\n        if (!hasListenerInAncestors(this, eventType)) {\n          tempListener = function() {};\n          this.addEventListener(eventType, tempListener, true);\n        }\n        try {\n          return unwrap(this).dispatchEvent_(nativeEvent);\n        } finally {\n          if (tempListener) this.removeEventListener(eventType, tempListener, true);\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) return true;\n        }\n      }\n      return false;\n    }\n    function hasListenerInAncestors(target, type) {\n      for (var node = unwrap(target); node; node = node.parentNode) {\n        if (hasListener(wrap(node), type)) return true;\n      }\n      return false;\n    }\n    if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);\n    function wrapEventTargetMethods(constructors) {\n      forwardMethodsToWrapper(constructors, methodNames);\n    }\n    var originalElementFromPoint = document.elementFromPoint;\n    function elementFromPoint(self, document, x, y) {\n      scope.renderAllPending();\n      var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n      if (!element) return null;\n      var path = getEventPath(element, null);\n      var idx = path.lastIndexOf(self);\n      if (idx == -1) return null; else path = path.slice(0, idx);\n      return eventRetargetting(path, self);\n    }\n    function getEventHandlerGetter(name) {\n      return function() {\n        var inlineEventHandlers = eventHandlersTable.get(this);\n        return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;\n      };\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        var old = inlineEventHandlers[name];\n        if (old) this.removeEventListener(eventType, old.wrapped, false);\n        if (typeof value === \"function\") {\n          var wrapped = function(e) {\n            var rv = value.call(this, e);\n            if (rv === false) e.preventDefault(); else if (name === \"onbeforeunload\" && typeof rv === \"string\") e.returnValue = rv;\n          };\n          this.addEventListener(eventType, wrapped, false);\n          inlineEventHandlers[name] = {\n            value: value,\n            wrapped: wrapped\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  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalTouchEvent = window.TouchEvent;\n    if (!OriginalTouchEvent) return;\n    var nativeEvent;\n    try {\n      nativeEvent = document.createEvent(\"TouchEvent\");\n    } catch (ex) {\n      return;\n    }\n    var nonEnumDescriptor = {\n      enumerable: false\n    };\n    function nonEnum(obj, prop) {\n      Object.defineProperty(obj, prop, nonEnumDescriptor);\n    }\n    function Touch(impl) {\n      setWrapper(impl, this);\n    }\n    Touch.prototype = {\n      get target() {\n        return wrap(unsafeUnwrap(this).target);\n      }\n    };\n    var descr = {\n      configurable: true,\n      enumerable: true,\n      get: null\n    };\n    [ \"clientX\", \"clientY\", \"screenX\", \"screenY\", \"pageX\", \"pageY\", \"identifier\", \"webkitRadiusX\", \"webkitRadiusY\", \"webkitRotationAngle\", \"webkitForce\" ].forEach(function(name) {\n      descr.get = function() {\n        return unsafeUnwrap(this)[name];\n      };\n      Object.defineProperty(Touch.prototype, name, descr);\n    });\n    function TouchList() {\n      this.length = 0;\n      nonEnum(this, \"length\");\n    }\n    TouchList.prototype = {\n      item: function(index) {\n        return this[index];\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    function TouchEvent(impl) {\n      UIEvent.call(this, impl);\n    }\n    TouchEvent.prototype = Object.create(UIEvent.prototype);\n    mixin(TouchEvent.prototype, {\n      get touches() {\n        return wrapTouchList(unsafeUnwrap(this).touches);\n      },\n      get targetTouches() {\n        return wrapTouchList(unsafeUnwrap(this).targetTouches);\n      },\n      get changedTouches() {\n        return wrapTouchList(unsafeUnwrap(this).changedTouches);\n      },\n      initTouchEvent: function() {\n        throw new Error(\"Not implemented\");\n      }\n    });\n    registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n    scope.wrappers.Touch = Touch;\n    scope.wrappers.TouchEvent = TouchEvent;\n    scope.wrappers.TouchList = TouchList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var unsafeUnwrap = scope.unsafeUnwrap;\n    var wrap = scope.wrap;\n    var nonEnumDescriptor = {\n      enumerable: false\n    };\n    function nonEnum(obj, prop) {\n      Object.defineProperty(obj, prop, nonEnumDescriptor);\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    function wrapNodeList(list) {\n      if (list == null) 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    function addWrapNodeListMethod(wrapperConstructor, name) {\n      wrapperConstructor.prototype[name] = function() {\n        return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n      };\n    }\n    scope.wrappers.NodeList = NodeList;\n    scope.addWrapNodeListMethod = addWrapNodeListMethod;\n    scope.wrapNodeList = wrapNodeList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    scope.wrapHTMLCollection = scope.wrapNodeList;\n    scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    function assertIsNodeWrapper(node) {\n      assert(node instanceof Node);\n    }\n    function createOneElementNodeList(node) {\n      var nodes = new NodeList();\n      nodes[0] = node;\n      nodes.length = 1;\n      return nodes;\n    }\n    var surpressMutations = false;\n    function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n      enqueueMutation(parent, \"childList\", {\n        removedNodes: nodes,\n        previousSibling: node.previousSibling,\n        nextSibling: node.nextSibling\n      });\n    }\n    function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n      enqueueMutation(df, \"childList\", {\n        removedNodes: nodes\n      });\n    }\n    function collectNodes(node, parentNode, previousNode, nextNode) {\n      if (node instanceof DocumentFragment) {\n        var nodes = collectNodesForDocumentFragment(node);\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        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        if (previousNode) previousNode.nextSibling_ = nodes[0];\n        if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];\n        return nodes;\n      }\n      var nodes = createOneElementNodeList(node);\n      var oldParent = node.parentNode;\n      if (oldParent) {\n        oldParent.removeChild(node);\n      }\n      node.parentNode_ = parentNode;\n      node.previousSibling_ = previousNode;\n      node.nextSibling_ = nextNode;\n      if (previousNode) previousNode.nextSibling_ = node;\n      if (nextNode) nextNode.previousSibling_ = node;\n      return nodes;\n    }\n    function collectNodesNative(node) {\n      if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);\n      var nodes = createOneElementNodeList(node);\n      var oldParent = node.parentNode;\n      if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n      return nodes;\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    function snapshotNodeList(nodeList) {\n      return nodeList;\n    }\n    function nodeWasAdded(node, treeScope) {\n      setTreeScope(node, treeScope);\n      node.nodeIsInserted_();\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    function nodeWasRemoved(node) {\n      setTreeScope(node, new TreeScope(node, null));\n    }\n    function nodesWereRemoved(nodes) {\n      for (var i = 0; i < nodes.length; i++) {\n        nodeWasRemoved(nodes[i]);\n      }\n    }\n    function ensureSameOwnerDocument(parent, child) {\n      var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;\n      if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);\n    }\n    function adoptNodesIfNeeded(owner, nodes) {\n      if (!nodes.length) return;\n      var ownerDoc = owner.ownerDocument;\n      if (ownerDoc === nodes[0].ownerDocument) return;\n      for (var i = 0; i < nodes.length; i++) {\n        scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n      }\n    }\n    function unwrapNodesForInsertion(owner, nodes) {\n      adoptNodesIfNeeded(owner, nodes);\n      var length = nodes.length;\n      if (length === 1) return unwrap(nodes[0]);\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    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    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) originalRemoveChild.call(parentNode, childNode);\n          childWrapper.previousSibling_ = childWrapper.nextSibling_ = 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    function invalidateParent(node) {\n      var p = node.parentNode;\n      return p && p.invalidateShadowRenderer();\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    var originalImportNode = document.importNode;\n    var originalCloneNode = window.Node.prototype.cloneNode;\n    function cloneNode(node, deep, opt_doc) {\n      var clone;\n      if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n      if (deep) {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          clone.appendChild(cloneNode(child, true, opt_doc));\n        }\n        if (node instanceof wrappers.HTMLTemplateElement) {\n          var cloneContent = clone.content;\n          for (var child = node.content.firstChild; child; child = child.nextSibling) {\n            cloneContent.appendChild(cloneNode(child, true, opt_doc));\n          }\n        }\n      }\n      return clone;\n    }\n    function contains(self, child) {\n      if (!child || getTreeScope(self) !== getTreeScope(child)) return false;\n      for (var node = child; node; node = node.parentNode) {\n        if (node === self) return true;\n      }\n      return false;\n    }\n    var OriginalNode = window.Node;\n    function Node(original) {\n      assert(original instanceof OriginalNode);\n      EventTarget.call(this, original);\n      this.parentNode_ = undefined;\n      this.firstChild_ = undefined;\n      this.lastChild_ = undefined;\n      this.nextSibling_ = undefined;\n      this.previousSibling_ = undefined;\n      this.treeScope_ = undefined;\n    }\n    var OriginalDocumentFragment = window.DocumentFragment;\n    var originalAppendChild = OriginalNode.prototype.appendChild;\n    var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;\n    var originalInsertBefore = OriginalNode.prototype.insertBefore;\n    var originalRemoveChild = OriginalNode.prototype.removeChild;\n    var originalReplaceChild = OriginalNode.prototype.replaceChild;\n    var isIe = /Trident|Edge/.test(navigator.userAgent);\n    var removeChildOriginalHelper = isIe ? function(parent, child) {\n      try {\n        originalRemoveChild.call(parent, child);\n      } catch (ex) {\n        if (!(parent instanceof OriginalDocumentFragment)) throw ex;\n      }\n    } : function(parent, child) {\n      originalRemoveChild.call(parent, child);\n    };\n    Node.prototype = Object.create(EventTarget.prototype);\n    mixin(Node.prototype, {\n      appendChild: function(childWrapper) {\n        return this.insertBefore(childWrapper, null);\n      },\n      insertBefore: function(childWrapper, refWrapper) {\n        assertIsNodeWrapper(childWrapper);\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        refWrapper && assert(refWrapper.parentNode === this);\n        var nodes;\n        var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;\n        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);\n        if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n        if (useNative) {\n          ensureSameOwnerDocument(this, childWrapper);\n          clearChildNodes(this);\n          originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n        } else {\n          if (!previousNode) this.firstChild_ = nodes[0];\n          if (!refWrapper) {\n            this.lastChild_ = nodes[nodes.length - 1];\n            if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;\n          }\n          var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n          if (parentNode) {\n            originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);\n          } else {\n            adoptNodesIfNeeded(this, nodes);\n          }\n        }\n        enqueueMutation(this, \"childList\", {\n          addedNodes: nodes,\n          nextSibling: refWrapper,\n          previousSibling: previousNode\n        });\n        nodesWereAdded(nodes, this);\n        return childWrapper;\n      },\n      removeChild: function(childWrapper) {\n        assertIsNodeWrapper(childWrapper);\n        if (childWrapper.parentNode !== this) {\n          var found = false;\n          var childNodes = this.childNodes;\n          for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {\n            if (ieChild === childWrapper) {\n              found = true;\n              break;\n            }\n          }\n          if (!found) {\n            throw new Error(\"NotFoundError\");\n          }\n        }\n        var childNode = unwrap(childWrapper);\n        var childWrapperNextSibling = childWrapper.nextSibling;\n        var childWrapperPreviousSibling = childWrapper.previousSibling;\n        if (this.invalidateShadowRenderer()) {\n          var thisFirstChild = this.firstChild;\n          var thisLastChild = this.lastChild;\n          var parentNode = childNode.parentNode;\n          if (parentNode) removeChildOriginalHelper(parentNode, childNode);\n          if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;\n          if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;\n          if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n          if (childWrapperNextSibling) {\n            childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;\n          }\n          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;\n        } else {\n          clearChildNodes(this);\n          removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n        }\n        if (!surpressMutations) {\n          enqueueMutation(this, \"childList\", {\n            removedNodes: createOneElementNodeList(childWrapper),\n            nextSibling: childWrapperNextSibling,\n            previousSibling: childWrapperPreviousSibling\n          });\n        }\n        registerTransientObservers(this, childWrapper);\n        return childWrapper;\n      },\n      replaceChild: function(newChildWrapper, oldChildWrapper) {\n        assertIsNodeWrapper(newChildWrapper);\n        var oldChildNode;\n        if (isWrapper(oldChildWrapper)) {\n          oldChildNode = unwrap(oldChildWrapper);\n        } else {\n          oldChildNode = oldChildWrapper;\n          oldChildWrapper = wrap(oldChildNode);\n        }\n        if (oldChildWrapper.parentNode !== this) {\n          throw new Error(\"NotFoundError\");\n        }\n        var nextNode = oldChildWrapper.nextSibling;\n        var previousNode = oldChildWrapper.previousSibling;\n        var nodes;\n        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);\n        if (useNative) {\n          nodes = collectNodesNative(newChildWrapper);\n        } else {\n          if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;\n          nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n        }\n        if (!useNative) {\n          if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];\n          if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];\n          oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;\n          if (oldChildNode.parentNode) {\n            originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);\n          }\n        } else {\n          ensureSameOwnerDocument(this, newChildWrapper);\n          clearChildNodes(this);\n          originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);\n        }\n        enqueueMutation(this, \"childList\", {\n          addedNodes: nodes,\n          removedNodes: createOneElementNodeList(oldChildWrapper),\n          nextSibling: nextNode,\n          previousSibling: previousNode\n        });\n        nodeWasRemoved(oldChildWrapper);\n        nodesWereAdded(nodes, this);\n        return oldChildWrapper;\n      },\n      nodeIsInserted_: function() {\n        for (var child = this.firstChild; child; child = child.nextSibling) {\n          child.nodeIsInserted_();\n        }\n      },\n      hasChildNodes: function() {\n        return this.firstChild !== null;\n      },\n      get parentNode() {\n        return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n      },\n      get firstChild() {\n        return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n      },\n      get lastChild() {\n        return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n      },\n      get nextSibling() {\n        return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n      },\n      get previousSibling() {\n        return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\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      get textContent() {\n        var s = \"\";\n        for (var child = this.firstChild; child; child = child.nextSibling) {\n          if (child.nodeType != Node.COMMENT_NODE) {\n            s += child.textContent;\n          }\n        }\n        return s;\n      },\n      set textContent(textContent) {\n        if (textContent == null) textContent = \"\";\n        var removedNodes = snapshotNodeList(this.childNodes);\n        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        var addedNodes = snapshotNodeList(this.childNodes);\n        enqueueMutation(this, \"childList\", {\n          addedNodes: addedNodes,\n          removedNodes: removedNodes\n        });\n        nodesWereRemoved(removedNodes);\n        nodesWereAdded(addedNodes, this);\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      cloneNode: function(deep) {\n        return cloneNode(this, deep);\n      },\n      contains: function(child) {\n        return contains(this, wrapIfNeeded(child));\n      },\n      compareDocumentPosition: function(otherNode) {\n        return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));\n      },\n      normalize: function() {\n        var nodes = snapshotNodeList(this.childNodes);\n        var remNodes = [];\n        var s = \"\";\n        var modNode;\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) this.removeNode(n); else if (!modNode) modNode = 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.normalize();\n          }\n        }\n        if (modNode && remNodes.length) {\n          modNode.data += s;\n          cleanupNodes(remNodes);\n        }\n      }\n    });\n    defineWrapGetter(Node, \"ownerDocument\");\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    scope.cloneNode = cloneNode;\n    scope.nodeWasAdded = nodeWasAdded;\n    scope.nodeWasRemoved = nodeWasRemoved;\n    scope.nodesWereAdded = nodesWereAdded;\n    scope.nodesWereRemoved = nodesWereRemoved;\n    scope.originalInsertBefore = originalInsertBefore;\n    scope.originalRemoveChild = originalRemoveChild;\n    scope.snapshotNodeList = snapshotNodeList;\n    scope.wrappers.Node = Node;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var originalDocumentQuerySelector = document.querySelector;\n    var originalElementQuerySelector = document.documentElement.querySelector;\n    var originalDocumentQuerySelectorAll = document.querySelectorAll;\n    var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n    var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n    var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n    var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n    var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n    var OriginalElement = window.Element;\n    var OriginalDocument = window.HTMLDocument || window.Document;\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      return index;\n    }\n    function shimSelector(selector) {\n      return String(selector).replace(/\\/deep\\//g, \" \");\n    }\n    function findOne(node, selector) {\n      var m, el = node.firstElementChild;\n      while (el) {\n        if (el.matches(selector)) return el;\n        m = findOne(el, selector);\n        if (m) return m;\n        el = el.nextElementSibling;\n      }\n      return null;\n    }\n    function matchesSelector(el, selector) {\n      return el.matches(selector);\n    }\n    var XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n    function matchesTagName(el, localName, localNameLowerCase) {\n      var ln = el.localName;\n      return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n    }\n    function matchesEveryThing() {\n      return true;\n    }\n    function matchesLocalNameOnly(el, ns, localName) {\n      return el.localName === localName;\n    }\n    function matchesNameSpace(el, ns) {\n      return el.namespaceURI === ns;\n    }\n    function matchesLocalNameNS(el, ns, localName) {\n      return el.namespaceURI === ns && el.localName === localName;\n    }\n    function findElements(node, index, result, p, arg0, arg1) {\n      var el = node.firstElementChild;\n      while (el) {\n        if (p(el, arg0, arg1)) result[index++] = el;\n        index = findElements(el, index, result, p, arg0, arg1);\n        el = el.nextElementSibling;\n      }\n      return index;\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        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        return findElements(this, index, result, p, selector, null);\n      }\n      return filterNodeList(list, index, result, deep);\n    }\n    var SelectorsInterface = {\n      querySelector: function(selector) {\n        var shimmed = shimSelector(selector);\n        var deep = shimmed !== selector;\n        selector = shimmed;\n        var target = unsafeUnwrap(this);\n        var wrappedItem;\n        var root = getTreeScope(this).root;\n        if (root instanceof scope.wrappers.ShadowRoot) {\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          return findOne(this, selector);\n        }\n        if (!wrappedItem) {\n          return wrappedItem;\n        } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n          if (root instanceof scope.wrappers.ShadowRoot) {\n            return findOne(this, selector);\n          }\n        }\n        return wrappedItem;\n      },\n      querySelectorAll: function(selector) {\n        var shimmed = shimSelector(selector);\n        var deep = shimmed !== selector;\n        selector = shimmed;\n        var result = new NodeList();\n        result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);\n        return result;\n      }\n    };\n    function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {\n      var target = unsafeUnwrap(this);\n      var list;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        return findElements(this, index, result, p, localName, lowercase);\n      } else if (target instanceof OriginalElement) {\n        list = originalElementGetElementsByTagName.call(target, localName, lowercase);\n      } else if (target instanceof OriginalDocument) {\n        list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);\n      } else {\n        return findElements(this, index, result, p, localName, lowercase);\n      }\n      return filterNodeList(list, index, result, false);\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        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        return findElements(this, index, result, p, ns, localName);\n      }\n      return filterNodeList(list, index, result, false);\n    }\n    var GetElementsByInterface = {\n      getElementsByTagName: function(localName) {\n        var result = new HTMLCollection();\n        var match = localName === \"*\" ? matchesEveryThing : matchesTagName;\n        result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());\n        return result;\n      },\n      getElementsByClassName: function(className) {\n        return this.querySelectorAll(\".\" + className);\n      },\n      getElementsByTagNameNS: function(ns, localName) {\n        var result = new HTMLCollection();\n        var match = null;\n        if (ns === \"*\") {\n          match = localName === \"*\" ? matchesEveryThing : matchesLocalNameOnly;\n        } else {\n          match = localName === \"*\" ? matchesNameSpace : matchesLocalNameNS;\n        }\n        result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);\n        return result;\n      }\n    };\n    scope.GetElementsByInterface = GetElementsByInterface;\n    scope.SelectorsInterface = SelectorsInterface;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var NodeList = scope.wrappers.NodeList;\n    function forwardElement(node) {\n      while (node && node.nodeType !== Node.ELEMENT_NODE) {\n        node = node.nextSibling;\n      }\n      return node;\n    }\n    function backwardsElement(node) {\n      while (node && node.nodeType !== Node.ELEMENT_NODE) {\n        node = node.previousSibling;\n      }\n      return node;\n    }\n    var ParentNodeInterface = {\n      get firstElementChild() {\n        return forwardElement(this.firstChild);\n      },\n      get lastElementChild() {\n        return backwardsElement(this.lastChild);\n      },\n      get childElementCount() {\n        var count = 0;\n        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n          count++;\n        }\n        return count;\n      },\n      get children() {\n        var wrapperList = new NodeList();\n        var i = 0;\n        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {\n          wrapperList[i++] = child;\n        }\n        wrapperList.length = i;\n        return wrapperList;\n      },\n      remove: function() {\n        var p = this.parentNode;\n        if (p) p.removeChild(this);\n      }\n    };\n    var ChildNodeInterface = {\n      get nextElementSibling() {\n        return forwardElement(this.nextSibling);\n      },\n      get previousElementSibling() {\n        return backwardsElement(this.previousSibling);\n      }\n    };\n    scope.ChildNodeInterface = ChildNodeInterface;\n    scope.ParentNodeInterface = ParentNodeInterface;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalCharacterData = window.CharacterData;\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    mixin(CharacterData.prototype, ChildNodeInterface);\n    registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(\"\"));\n    scope.wrappers.CharacterData = CharacterData;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var CharacterData = scope.wrappers.CharacterData;\n    var enqueueMutation = scope.enqueueMutation;\n    var mixin = scope.mixin;\n    var registerWrapper = scope.registerWrapper;\n    function toUInt32(x) {\n      return x >>> 0;\n    }\n    var OriginalText = window.Text;\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) 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) this.parentNode.insertBefore(newTextNode, this.nextSibling);\n        return newTextNode;\n      }\n    });\n    registerWrapper(OriginalText, Text, document.createTextNode(\"\"));\n    scope.wrappers.Text = Text;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var setWrapper = scope.setWrapper;\n    var unsafeUnwrap = scope.unsafeUnwrap;\n    function invalidateClass(el) {\n      scope.invalidateRendererBasedOnAttribute(el, \"class\");\n    }\n    function DOMTokenList(impl, ownerElement) {\n      setWrapper(impl, this);\n      this.ownerElement_ = ownerElement;\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    scope.wrappers.DOMTokenList = DOMTokenList;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalElement = window.Element;\n    var matchesNames = [ \"matches\", \"mozMatchesSelector\", \"msMatchesSelector\", \"webkitMatchesSelector\" ].filter(function(name) {\n      return OriginalElement.prototype[name];\n    });\n    var matchesName = matchesNames[0];\n    var originalMatches = OriginalElement.prototype[matchesName];\n    function invalidateRendererBasedOnAttribute(element, name) {\n      var p = element.parentNode;\n      if (!p || !p.shadowRoot) return;\n      var renderer = scope.getRendererForHost(p);\n      if (renderer.dependsOnAttribute(name)) renderer.invalidate();\n    }\n    function enqueAttributeChange(element, name, oldValue) {\n      enqueueMutation(element, \"attributes\", {\n        name: name,\n        namespace: null,\n        oldValue: oldValue\n      });\n    }\n    var classListTable = new WeakMap();\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        var renderer = scope.getRendererForHost(this);\n        renderer.invalidate();\n        return newShadowRoot;\n      },\n      get shadowRoot() {\n        return unsafeUnwrap(this).polymerShadowRoot_ || null;\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      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      matches: function(selector) {\n        return originalMatches.call(unsafeUnwrap(this), selector);\n      },\n      get classList() {\n        var list = classListTable.get(this);\n        if (!list) {\n          classListTable.set(this, list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n        }\n        return list;\n      },\n      get className() {\n        return unsafeUnwrap(this).className;\n      },\n      set className(v) {\n        this.setAttribute(\"class\", v);\n      },\n      get id() {\n        return unsafeUnwrap(this).id;\n      },\n      set id(v) {\n        this.setAttribute(\"id\", v);\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    if (OriginalElement.prototype.webkitCreateShadowRoot) {\n      Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n    }\n    mixin(Element.prototype, ChildNodeInterface);\n    mixin(Element.prototype, GetElementsByInterface);\n    mixin(Element.prototype, ParentNodeInterface);\n    mixin(Element.prototype, SelectorsInterface);\n    registerWrapper(OriginalElement, Element, document.createElementNS(null, \"x\"));\n    scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n    scope.matchesNames = matchesNames;\n    scope.wrappers.Element = Element;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var escapeAttrRegExp = /[&\\u00A0\"]/g;\n    var escapeDataRegExp = /[&\\u00A0<>]/g;\n    function escapeReplace(c) {\n      switch (c) {\n       case \"&\":\n        return \"&amp;\";\n\n       case \"<\":\n        return \"&lt;\";\n\n       case \">\":\n        return \"&gt;\";\n\n       case '\"':\n        return \"&quot;\";\n\n       case \" \":\n        return \"&nbsp;\";\n      }\n    }\n    function escapeAttr(s) {\n      return s.replace(escapeAttrRegExp, escapeReplace);\n    }\n    function escapeData(s) {\n      return s.replace(escapeDataRegExp, escapeReplace);\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    var voidElements = makeSet([ \"area\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"wbr\" ]);\n    var plaintextParents = makeSet([ \"style\", \"script\", \"xmp\", \"iframe\", \"noembed\", \"noframes\", \"plaintext\", \"noscript\" ]);\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]) return s;\n        return s + getInnerHTML(node) + \"</\" + tagName + \">\";\n\n       case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName]) 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    function getInnerHTML(node) {\n      if (node instanceof wrappers.HTMLTemplateElement) node = node.content;\n      var s = \"\";\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        s += getOuterHTML(child, node);\n      }\n      return s;\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    var oldIe = /MSIE/.test(navigator.userAgent);\n    var OriginalHTMLElement = window.HTMLElement;\n    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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        if (oldIe && plaintextParents[this.localName]) {\n          this.textContent = value;\n          return;\n        }\n        var removedNodes = snapshotNodeList(this.childNodes);\n        if (this.invalidateShadowRenderer()) {\n          if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);\n        } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {\n          setInnerHTML(this.content, value);\n        } else {\n          unsafeUnwrap(this).innerHTML = value;\n        }\n        var addedNodes = snapshotNodeList(this.childNodes);\n        enqueueMutation(this, \"childList\", {\n          addedNodes: addedNodes,\n          removedNodes: removedNodes\n        });\n        nodesWereRemoved(removedNodes);\n        nodesWereAdded(addedNodes, this);\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      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\n         case \"afterend\":\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n\n         case \"afterbegin\":\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n\n         case \"beforeend\":\n          contextElement = this;\n          refNode = null;\n          break;\n\n         default:\n          return;\n        }\n        var df = frag(contextElement, text);\n        contextElement.insertBefore(df, refNode);\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    function frag(contextElement, html) {\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    function getter(name) {\n      return function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name];\n      };\n    }\n    function getterRequiresRendering(name) {\n      defineGetter(HTMLElement, name, getter(name));\n    }\n    [ \"clientHeight\", \"clientLeft\", \"clientTop\", \"clientWidth\", \"offsetHeight\", \"offsetLeft\", \"offsetTop\", \"offsetWidth\", \"scrollHeight\", \"scrollWidth\" ].forEach(getterRequiresRendering);\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    [ \"scrollLeft\", \"scrollTop\" ].forEach(getterAndSetterRequiresRendering);\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    [ \"getBoundingClientRect\", \"getClientRects\", \"scrollIntoView\" ].forEach(methodRequiresRendering);\n    registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement(\"b\"));\n    scope.wrappers.HTMLElement = HTMLElement;\n    scope.getInnerHTML = getInnerHTML;\n    scope.setInnerHTML = setInnerHTML;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n    function HTMLCanvasElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\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    registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement(\"canvas\"));\n    scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var mixin = scope.mixin;\n    var registerWrapper = scope.registerWrapper;\n    var OriginalHTMLContentElement = window.HTMLContentElement;\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      get select() {\n        return this.getAttribute(\"select\");\n      },\n      set select(value) {\n        this.setAttribute(\"select\", value);\n      },\n      setAttribute: function(n, v) {\n        HTMLElement.prototype.setAttribute.call(this, n, v);\n        if (String(n).toLowerCase() === \"select\") this.invalidateShadowRenderer(true);\n      }\n    });\n    if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n    scope.wrappers.HTMLContentElement = HTMLContentElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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 OriginalHTMLFormElement = window.HTMLFormElement;\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        return wrapHTMLCollection(unwrap(this).elements);\n      }\n    });\n    registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement(\"form\"));\n    scope.wrappers.HTMLFormElement = HTMLFormElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var registerWrapper = scope.registerWrapper;\n    var unwrap = scope.unwrap;\n    var rewrap = scope.rewrap;\n    var OriginalHTMLImageElement = window.HTMLImageElement;\n    function HTMLImageElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n    registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement(\"img\"));\n    function Image(width, height) {\n      if (!(this instanceof Image)) {\n        throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n      }\n      var node = unwrap(document.createElement(\"img\"));\n      HTMLElement.call(this, node);\n      rewrap(node, this);\n      if (width !== undefined) node.width = width;\n      if (height !== undefined) node.height = height;\n    }\n    Image.prototype = HTMLImageElement.prototype;\n    scope.wrappers.HTMLImageElement = HTMLImageElement;\n    scope.wrappers.Image = Image;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var mixin = scope.mixin;\n    var NodeList = scope.wrappers.NodeList;\n    var registerWrapper = scope.registerWrapper;\n    var OriginalHTMLShadowElement = window.HTMLShadowElement;\n    function HTMLShadowElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n    HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n    if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n    scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var contentTable = new WeakMap();\n    var templateContentsOwnerTable = new WeakMap();\n    function getTemplateContentsOwner(doc) {\n      if (!doc.defaultView) return doc;\n      var d = templateContentsOwnerTable.get(doc);\n      if (!d) {\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    function extractContent(templateElement) {\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    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\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    mixin(HTMLTemplateElement.prototype, {\n      constructor: HTMLTemplateElement,\n      get content() {\n        if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);\n        return contentTable.get(this);\n      }\n    });\n    if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n    scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var registerWrapper = scope.registerWrapper;\n    var OriginalHTMLMediaElement = window.HTMLMediaElement;\n    if (!OriginalHTMLMediaElement) return;\n    function HTMLMediaElement(node) {\n      HTMLElement.call(this, node);\n    }\n    HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n    registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement(\"audio\"));\n    scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n    var registerWrapper = scope.registerWrapper;\n    var unwrap = scope.unwrap;\n    var rewrap = scope.rewrap;\n    var OriginalHTMLAudioElement = window.HTMLAudioElement;\n    if (!OriginalHTMLAudioElement) return;\n    function HTMLAudioElement(node) {\n      HTMLMediaElement.call(this, node);\n    }\n    HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n    registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement(\"audio\"));\n    function Audio(src) {\n      if (!(this instanceof Audio)) {\n        throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n      }\n      var node = unwrap(document.createElement(\"audio\"));\n      HTMLMediaElement.call(this, node);\n      rewrap(node, this);\n      node.setAttribute(\"preload\", \"auto\");\n      if (src !== undefined) node.setAttribute(\"src\", src);\n    }\n    Audio.prototype = HTMLAudioElement.prototype;\n    scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n    scope.wrappers.Audio = Audio;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLOptionElement = window.HTMLOptionElement;\n    function trimText(s) {\n      return s.replace(/\\s+/g, \" \").trim();\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    registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement(\"option\"));\n    function Option(text, value, defaultSelected, selected) {\n      if (!(this instanceof Option)) {\n        throw new TypeError(\"DOM object constructor cannot be called as a function.\");\n      }\n      var node = unwrap(document.createElement(\"option\"));\n      HTMLElement.call(this, node);\n      rewrap(node, this);\n      if (text !== undefined) node.text = text;\n      if (value !== undefined) node.setAttribute(\"value\", value);\n      if (defaultSelected === true) node.setAttribute(\"selected\", \"\");\n      node.selected = selected === true;\n    }\n    Option.prototype = HTMLOptionElement.prototype;\n    scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n    scope.wrappers.Option = Option;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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 OriginalHTMLSelectElement = window.HTMLSelectElement;\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\") before = unwrap(before);\n        unwrap(this).add(unwrap(element), before);\n      },\n      remove: function(indexOrNode) {\n        if (indexOrNode === undefined) {\n          HTMLElement.prototype.remove.call(this);\n          return;\n        }\n        if (typeof indexOrNode === \"object\") indexOrNode = unwrap(indexOrNode);\n        unwrap(this).remove(indexOrNode);\n      },\n      get form() {\n        return wrap(unwrap(this).form);\n      }\n    });\n    registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement(\"select\"));\n    scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLTableElement = window.HTMLTableElement;\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      get tHead() {\n        return wrap(unwrap(this).tHead);\n      },\n      createTHead: function() {\n        return wrap(unwrap(this).createTHead());\n      },\n      createTFoot: function() {\n        return wrap(unwrap(this).createTFoot());\n      },\n      get tFoot() {\n        return wrap(unwrap(this).tFoot);\n      },\n      get tBodies() {\n        return wrapHTMLCollection(unwrap(this).tBodies);\n      },\n      createTBody: function() {\n        return wrap(unwrap(this).createTBody());\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    registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement(\"table\"));\n    scope.wrappers.HTMLTableElement = HTMLTableElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\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    registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement(\"thead\"));\n    scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\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      insertCell: function(index) {\n        return wrap(unwrap(this).insertCell(index));\n      }\n    });\n    registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement(\"tr\"));\n    scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n    function HTMLUnknownElement(node) {\n      switch (node.localName) {\n       case \"content\":\n        return new HTMLContentElement(node);\n\n       case \"shadow\":\n        return new HTMLShadowElement(node);\n\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  (function(scope) {\n    \"use strict\";\n    var Element = scope.wrappers.Element;\n    var HTMLElement = scope.wrappers.HTMLElement;\n    var registerObject = scope.registerObject;\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    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    scope.wrappers.SVGElement = SVGElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var mixin = scope.mixin;\n    var registerWrapper = scope.registerWrapper;\n    var unwrap = scope.unwrap;\n    var wrap = scope.wrap;\n    var OriginalSVGUseElement = window.SVGUseElement;\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    function SVGUseElement(impl) {\n      parentInterface.call(this, impl);\n    }\n    SVGUseElement.prototype = Object.create(parentInterfacePrototype);\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    registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n    scope.wrappers.SVGUseElement = SVGUseElement;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalSVGElementInstance = window.SVGElementInstance;\n    if (!OriginalSVGElementInstance) return;\n    function SVGElementInstance(impl) {\n      EventTarget.call(this, impl);\n    }\n    SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n    mixin(SVGElementInstance.prototype, {\n      get correspondingElement() {\n        return wrap(unsafeUnwrap(this).correspondingElement);\n      },\n      get correspondingUseElement() {\n        return wrap(unsafeUnwrap(this).correspondingUseElement);\n      },\n      get parentNode() {\n        return wrap(unsafeUnwrap(this).parentNode);\n      },\n      get childNodes() {\n        throw new Error(\"Not implemented\");\n      },\n      get firstChild() {\n        return wrap(unsafeUnwrap(this).firstChild);\n      },\n      get lastChild() {\n        return wrap(unsafeUnwrap(this).lastChild);\n      },\n      get previousSibling() {\n        return wrap(unsafeUnwrap(this).previousSibling);\n      },\n      get nextSibling() {\n        return wrap(unsafeUnwrap(this).nextSibling);\n      }\n    });\n    registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n    scope.wrappers.SVGElementInstance = SVGElementInstance;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n    function CanvasRenderingContext2D(impl) {\n      setWrapper(impl, this);\n    }\n    mixin(CanvasRenderingContext2D.prototype, {\n      get canvas() {\n        return wrap(unsafeUnwrap(this).canvas);\n      },\n      drawImage: function() {\n        arguments[0] = unwrapIfNeeded(arguments[0]);\n        unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n      },\n      createPattern: function() {\n        arguments[0] = unwrap(arguments[0]);\n        return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n      }\n    });\n    registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement(\"canvas\").getContext(\"2d\"));\n    scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n    if (!OriginalWebGLRenderingContext) return;\n    function WebGLRenderingContext(impl) {\n      setWrapper(impl, this);\n    }\n    mixin(WebGLRenderingContext.prototype, {\n      get canvas() {\n        return wrap(unsafeUnwrap(this).canvas);\n      },\n      texImage2D: function() {\n        arguments[5] = unwrapIfNeeded(arguments[5]);\n        unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n      },\n      texSubImage2D: function() {\n        arguments[6] = unwrapIfNeeded(arguments[6]);\n        unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n      }\n    });\n    var instanceProperties = /WebKit/.test(navigator.userAgent) ? {\n      drawingBufferHeight: null,\n      drawingBufferWidth: null\n    } : {};\n    registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);\n    scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalRange = window.Range;\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    if (OriginalRange.prototype.createContextualFragment) {\n      Range.prototype.createContextualFragment = function(html) {\n        return wrap(unsafeUnwrap(this).createContextualFragment(html));\n      };\n    }\n    registerWrapper(window.Range, Range, document.createRange());\n    scope.wrappers.Range = Range;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var DocumentFragment = registerObject(document.createDocumentFragment());\n    mixin(DocumentFragment.prototype, ParentNodeInterface);\n    mixin(DocumentFragment.prototype, SelectorsInterface);\n    mixin(DocumentFragment.prototype, GetElementsByInterface);\n    var Comment = registerObject(document.createComment(\"\"));\n    scope.wrappers.Comment = Comment;\n    scope.wrappers.DocumentFragment = DocumentFragment;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var shadowHostTable = new WeakMap();\n    var nextOlderShadowTreeTable = new WeakMap();\n    var spaceCharRe = /[ \\t\\n\\r\\f]/;\n    function ShadowRoot(hostWrapper) {\n      var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n      DocumentFragment.call(this, node);\n      rewrap(node, this);\n      var oldShadowRoot = hostWrapper.shadowRoot;\n      nextOlderShadowTreeTable.set(this, oldShadowRoot);\n      this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n      shadowHostTable.set(this, hostWrapper);\n    }\n    ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n    mixin(ShadowRoot.prototype, {\n      constructor: ShadowRoot,\n      get innerHTML() {\n        return getInnerHTML(this);\n      },\n      set innerHTML(value) {\n        setInnerHTML(this, value);\n        this.invalidateShadowRenderer();\n      },\n      get olderShadowRoot() {\n        return nextOlderShadowTreeTable.get(this) || null;\n      },\n      get host() {\n        return shadowHostTable.get(this) || null;\n      },\n      invalidateShadowRenderer: function() {\n        return shadowHostTable.get(this).invalidateShadowRenderer();\n      },\n      elementFromPoint: function(x, y) {\n        return elementFromPoint(this, this.ownerDocument, x, y);\n      },\n      getElementById: function(id) {\n        if (spaceCharRe.test(id)) return null;\n        return this.querySelector('[id=\"' + id + '\"]');\n      }\n    });\n    scope.wrappers.ShadowRoot = ShadowRoot;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var ArraySplice = scope.ArraySplice;\n    function updateWrapperUpAndSideways(wrapper) {\n      wrapper.previousSibling_ = wrapper.previousSibling;\n      wrapper.nextSibling_ = wrapper.nextSibling;\n      wrapper.parentNode_ = wrapper.parentNode;\n    }\n    function updateWrapperDown(wrapper) {\n      wrapper.firstChild_ = wrapper.firstChild;\n      wrapper.lastChild_ = wrapper.lastChild;\n    }\n    function updateAllChildNodes(parentNodeWrapper) {\n      assert(parentNodeWrapper instanceof Node);\n      for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {\n        updateWrapperUpAndSideways(childWrapper);\n      }\n      updateWrapperDown(parentNodeWrapper);\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      remove(newChildWrapper);\n      updateWrapperUpAndSideways(newChildWrapper);\n      if (!refChildWrapper) {\n        parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n        if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n        var lastChildWrapper = wrap(parentNode.lastChild);\n        if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n      } else {\n        if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;\n        refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n      }\n      scope.originalInsertBefore.call(parentNode, newChild, refChild);\n    }\n    function remove(nodeWrapper) {\n      var node = unwrap(nodeWrapper);\n      var parentNode = node.parentNode;\n      if (!parentNode) return;\n      var parentNodeWrapper = wrap(parentNode);\n      updateWrapperUpAndSideways(nodeWrapper);\n      if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n      if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n      if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;\n      if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;\n      scope.originalRemoveChild.call(parentNode, node);\n    }\n    var distributedNodesTable = new WeakMap();\n    var destinationInsertionPointsTable = new WeakMap();\n    var rendererForHostTable = new WeakMap();\n    function resetDistributedNodes(insertionPoint) {\n      distributedNodesTable.set(insertionPoint, []);\n    }\n    function getDistributedNodes(insertionPoint) {\n      var rv = distributedNodesTable.get(insertionPoint);\n      if (!rv) distributedNodesTable.set(insertionPoint, rv = []);\n      return rv;\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    var request = oneOf(window, [ \"requestAnimationFrame\", \"mozRequestAnimationFrame\", \"webkitRequestAnimationFrame\", \"setTimeout\" ]);\n    var pendingDirtyRenderers = [];\n    var renderTimer;\n    function renderAllPending() {\n      for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n        var renderer = pendingDirtyRenderers[i];\n        var parentRenderer = renderer.parentRenderer;\n        if (parentRenderer && parentRenderer.dirty) continue;\n        renderer.render();\n      }\n      pendingDirtyRenderers = [];\n    }\n    function handleRequestAnimationFrame() {\n      renderTimer = null;\n      renderAllPending();\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    function getShadowRootAncestor(node) {\n      var root = getTreeScope(node).root;\n      if (root instanceof ShadowRoot) return root;\n      return null;\n    }\n    function getRendererForShadowRoot(shadowRoot) {\n      return getRendererForHost(shadowRoot.host);\n    }\n    var spliceDiff = new ArraySplice();\n    spliceDiff.equals = function(renderNode, rawNode) {\n      return unwrap(renderNode.node) === rawNode;\n    };\n    function RenderNode(node) {\n      this.skip = false;\n      this.node = node;\n      this.childNodes = [];\n    }\n    RenderNode.prototype = {\n      append: function(node) {\n        var rv = new RenderNode(node);\n        this.childNodes.push(rv);\n        return rv;\n      },\n      sync: function(opt_added) {\n        if (this.skip) return;\n        var nodeWrapper = this.node;\n        var newChildren = this.childNodes;\n        var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n        var added = opt_added || new WeakMap();\n        var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\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          var removedCount = splice.removed.length;\n          for (var j = 0; j < removedCount; j++) {\n            var wrapper = wrap(oldChildren[oldIndex++]);\n            if (!added.get(wrapper)) remove(wrapper);\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            added.set(newChildWrapper, true);\n            newChildRenderNode.sync(added);\n          }\n          lastIndex += addedCount;\n        }\n        for (var i = lastIndex; i < newChildren.length; i++) {\n          newChildren[i].sync(added);\n        }\n      }\n    };\n    function ShadowRenderer(host) {\n      this.host = host;\n      this.dirty = false;\n      this.invalidateAttributes();\n      this.associateNode(host);\n    }\n    ShadowRenderer.prototype = {\n      render: function(opt_renderNode) {\n        if (!this.dirty) return;\n        this.invalidateAttributes();\n        var host = this.host;\n        this.distribution(host);\n        var renderNode = opt_renderNode || new RenderNode(host);\n        this.buildRenderTree(renderNode, host);\n        var topMostRenderer = !opt_renderNode;\n        if (topMostRenderer) renderNode.sync();\n        this.dirty = false;\n      },\n      get parentRenderer() {\n        return getTreeScope(this.host).renderer;\n      },\n      invalidate: function() {\n        if (!this.dirty) {\n          this.dirty = true;\n          var parentRenderer = this.parentRenderer;\n          if (parentRenderer) parentRenderer.invalidate();\n          pendingDirtyRenderers.push(this);\n          if (renderTimer) return;\n          renderTimer = window[request](handleRequestAnimationFrame, 0);\n        }\n      },\n      distribution: function(root) {\n        this.resetAllSubtrees(root);\n        this.distributionResolution(root);\n      },\n      resetAll: function(node) {\n        if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);\n        this.resetAllSubtrees(node);\n      },\n      resetAllSubtrees: function(node) {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.resetAll(child);\n        }\n        if (node.shadowRoot) this.resetAll(node.shadowRoot);\n        if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);\n      },\n      distributionResolution: function(node) {\n        if (isShadowHost(node)) {\n          var shadowHost = node;\n          var pool = poolPopulation(shadowHost);\n          var shadowTrees = getShadowTrees(shadowHost);\n          for (var i = 0; i < shadowTrees.length; i++) {\n            this.poolDistribution(shadowTrees[i], pool);\n          }\n          for (var i = shadowTrees.length - 1; i >= 0; i--) {\n            var shadowTree = shadowTrees[i];\n            var shadow = getShadowInsertionPoint(shadowTree);\n            if (shadow) {\n              var olderShadowRoot = shadowTree.olderShadowRoot;\n              if (olderShadowRoot) {\n                pool = poolPopulation(olderShadowRoot);\n              }\n              for (var j = 0; j < pool.length; j++) {\n                destributeNodeInto(pool[j], shadow);\n              }\n            }\n            this.distributionResolution(shadowTree);\n          }\n        }\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.distributionResolution(child);\n        }\n      },\n      poolDistribution: function(node, pool) {\n        if (node instanceof HTMLShadowElement) return;\n        if (node instanceof HTMLContentElement) {\n          var content = node;\n          this.updateDependentAttributes(content.getAttribute(\"select\"));\n          var anyDistributed = false;\n          for (var i = 0; i < pool.length; i++) {\n            var node = pool[i];\n            if (!node) continue;\n            if (matches(node, content)) {\n              destributeNodeInto(node, content);\n              pool[i] = undefined;\n              anyDistributed = true;\n            }\n          }\n          if (!anyDistributed) {\n            for (var child = content.firstChild; child; child = child.nextSibling) {\n              destributeNodeInto(child, content);\n            }\n          }\n          return;\n        }\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.poolDistribution(child, pool);\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        if (isShadowHost(node)) {\n          var renderer = getRendererForHost(node);\n          renderer.dirty = false;\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)) children.push(distributedNode);\n            }\n          } else {\n            children.push(child);\n          }\n        }\n        return children;\n      },\n      invalidateAttributes: function() {\n        this.attributes = Object.create(null);\n      },\n      updateDependentAttributes: function(selector) {\n        if (!selector) return;\n        var attributes = this.attributes;\n        if (/\\.\\w+/.test(selector)) attributes[\"class\"] = true;\n        if (/#\\w+/.test(selector)) attributes[\"id\"] = true;\n        selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n          attributes[name] = true;\n        });\n      },\n      dependsOnAttribute: function(name) {\n        return this.attributes[name];\n      },\n      associateNode: function(node) {\n        unsafeUnwrap(node).polymerShadowRenderer_ = this;\n      }\n    };\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    function getShadowInsertionPoint(node) {\n      if (node instanceof HTMLShadowElement) return node;\n      if (node instanceof HTMLContentElement) return null;\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        var res = getShadowInsertionPoint(child);\n        if (res) return res;\n      }\n      return null;\n    }\n    function destributeNodeInto(child, insertionPoint) {\n      getDistributedNodes(insertionPoint).push(child);\n      var points = destinationInsertionPointsTable.get(child);\n      if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);\n    }\n    function getDestinationInsertionPoints(node) {\n      return destinationInsertionPointsTable.get(node);\n    }\n    function resetDestinationInsertionPoints(node) {\n      destinationInsertionPointsTable.set(node, undefined);\n    }\n    var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n    function matches(node, contentElement) {\n      var select = contentElement.getAttribute(\"select\");\n      if (!select) return true;\n      select = select.trim();\n      if (!select) return true;\n      if (!(node instanceof Element)) return false;\n      if (!selectorStartCharRe.test(select)) return false;\n      try {\n        return node.matches(select);\n      } catch (ex) {\n        return false;\n      }\n    }\n    function isFinalDestination(insertionPoint, node) {\n      var points = getDestinationInsertionPoints(node);\n      return points && points[points.length - 1] === insertionPoint;\n    }\n    function isInsertionPoint(node) {\n      return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;\n    }\n    function isShadowHost(shadowHost) {\n      return shadowHost.shadowRoot;\n    }\n    function getShadowTrees(host) {\n      var trees = [];\n      for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n        trees.push(tree);\n      }\n      return trees;\n    }\n    function render(host) {\n      new ShadowRenderer(host).render();\n    }\n    Node.prototype.invalidateShadowRenderer = function(force) {\n      var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n      if (renderer) {\n        renderer.invalidate();\n        return true;\n      }\n      return false;\n    };\n    HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {\n      renderAllPending();\n      return getDistributedNodes(this);\n    };\n    Element.prototype.getDestinationInsertionPoints = function() {\n      renderAllPending();\n      return getDestinationInsertionPoints(this) || [];\n    };\n    HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n      this.invalidateShadowRenderer();\n      var shadowRoot = getShadowRootAncestor(this);\n      var renderer;\n      if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);\n      unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n      if (renderer) renderer.invalidate();\n    };\n    scope.getRendererForHost = getRendererForHost;\n    scope.getShadowTrees = getShadowTrees;\n    scope.renderAllPending = renderAllPending;\n    scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n    scope.visual = {\n      insertBefore: insertBefore,\n      remove: remove\n    };\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var elementsWithFormProperty = [ \"HTMLButtonElement\", \"HTMLFieldSetElement\", \"HTMLInputElement\", \"HTMLKeygenElement\", \"HTMLLabelElement\", \"HTMLLegendElement\", \"HTMLObjectElement\", \"HTMLOutputElement\", \"HTMLTextAreaElement\" ];\n    function createWrapperConstructor(name) {\n      if (!window[name]) return;\n      assert(!scope.wrappers[name]);\n      var GeneratedWrapper = function(node) {\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      registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));\n      scope.wrappers[name] = GeneratedWrapper;\n    }\n    elementsWithFormProperty.forEach(createWrapperConstructor);\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalSelection = window.Selection;\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    registerWrapper(window.Selection, Selection, window.getSelection());\n    scope.wrappers.Selection = Selection;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var implementationTable = new WeakMap();\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    defineWrapGetter(Document, \"documentElement\");\n    defineWrapGetter(Document, \"body\");\n    defineWrapGetter(Document, \"head\");\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    [ \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"getElementById\" ].forEach(wrapMethod);\n    var originalAdoptNode = document.adoptNode;\n    function adoptNodeNoRemove(node, doc) {\n      originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n      adoptSubtree(node, doc);\n    }\n    function adoptSubtree(node, doc) {\n      if (node.shadowRoot) doc.adoptNode(node.shadowRoot);\n      if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        adoptSubtree(child, doc);\n      }\n    }\n    function adoptOlderShadowRoots(shadowRoot, doc) {\n      var oldShadowRoot = shadowRoot.olderShadowRoot;\n      if (oldShadowRoot) doc.adoptNode(oldShadowRoot);\n    }\n    var originalGetSelection = document.getSelection;\n    mixin(Document.prototype, {\n      adoptNode: function(node) {\n        if (node.parentNode) 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, \"[name=\" + JSON.stringify(String(name)) + \"]\");\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        if (!prototype) prototype = Object.create(HTMLElement.prototype);\n        if (scope.nativePrototypeTable.get(prototype)) {\n          throw new Error(\"NotSupportedError\");\n        }\n        var proto = Object.getPrototypeOf(prototype);\n        var nativePrototype;\n        var prototypes = [];\n        while (proto) {\n          nativePrototype = scope.nativePrototypeTable.get(proto);\n          if (nativePrototype) break;\n          prototypes.push(proto);\n          proto = Object.getPrototypeOf(proto);\n        }\n        if (!nativePrototype) {\n          throw new Error(\"NotSupportedError\");\n        }\n        var newPrototype = Object.create(nativePrototype);\n        for (var i = prototypes.length - 1; i >= 0; i--) {\n          newPrototype = Object.create(newPrototype);\n        }\n        [ \"createdCallback\", \"attachedCallback\", \"detachedCallback\", \"attributeChangedCallback\" ].forEach(function(name) {\n          var f = prototype[name];\n          if (!f) return;\n          newPrototype[name] = function() {\n            if (!(wrap(this) instanceof CustomElementConstructor)) {\n              rewrap(this);\n            }\n            f.apply(wrap(this), arguments);\n          };\n        });\n        var p = {\n          prototype: newPrototype\n        };\n        if (extendsOption) p.extends = extendsOption;\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        scope.constructorTable.set(newPrototype, CustomElementConstructor);\n        scope.nativePrototypeTable.set(prototype, newPrototype);\n        var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);\n        return CustomElementConstructor;\n      };\n      forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"registerElement\" ]);\n    }\n    forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ \"appendChild\", \"compareDocumentPosition\", \"contains\", \"getElementsByClassName\", \"getElementsByTagName\", \"getElementsByTagNameNS\", \"insertBefore\", \"querySelector\", \"querySelectorAll\", \"removeChild\", \"replaceChild\" ].concat(matchesNames));\n    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ \"adoptNode\", \"importNode\", \"contains\", \"createComment\", \"createDocumentFragment\", \"createElement\", \"createElementNS\", \"createEvent\", \"createEventNS\", \"createRange\", \"createTextNode\", \"elementFromPoint\", \"getElementById\", \"getElementsByName\", \"getSelection\" ]);\n    mixin(Document.prototype, GetElementsByInterface);\n    mixin(Document.prototype, ParentNodeInterface);\n    mixin(Document.prototype, SelectorsInterface);\n    mixin(Document.prototype, {\n      get implementation() {\n        var implementation = implementationTable.get(this);\n        if (implementation) return implementation;\n        implementation = new DOMImplementation(unwrap(this).implementation);\n        implementationTable.set(this, implementation);\n        return implementation;\n      },\n      get defaultView() {\n        return wrap(unwrap(this).defaultView);\n      }\n    });\n    registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(\"\"));\n    if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);\n    wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);\n    function DOMImplementation(impl) {\n      setWrapper(impl, this);\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    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    wrapImplMethod(DOMImplementation, \"createDocumentType\");\n    wrapImplMethod(DOMImplementation, \"createDocument\");\n    wrapImplMethod(DOMImplementation, \"createHTMLDocument\");\n    forwardImplMethod(DOMImplementation, \"hasFeature\");\n    registerWrapper(window.DOMImplementation, DOMImplementation);\n    forwardMethodsToWrapper([ window.DOMImplementation ], [ \"createDocumentType\", \"createDocument\", \"createHTMLDocument\", \"hasFeature\" ]);\n    scope.adoptNodeNoRemove = adoptNodeNoRemove;\n    scope.wrappers.DOMImplementation = DOMImplementation;\n    scope.wrappers.Document = Document;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\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    var OriginalWindow = window.Window;\n    var originalGetComputedStyle = window.getComputedStyle;\n    var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n    var originalGetSelection = window.getSelection;\n    function Window(impl) {\n      EventTarget.call(this, impl);\n    }\n    Window.prototype = Object.create(EventTarget.prototype);\n    OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n    };\n    if (originalGetDefaultComputedStyle) {\n      OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n        return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);\n      };\n    }\n    OriginalWindow.prototype.getSelection = function() {\n      return wrap(this || window).getSelection();\n    };\n    delete window.getComputedStyle;\n    delete window.getDefaultComputedStyle;\n    delete window.getSelection;\n    [ \"addEventListener\", \"removeEventListener\", \"dispatchEvent\" ].forEach(function(name) {\n      OriginalWindow.prototype[name] = function() {\n        var w = wrap(this || window);\n        return w[name].apply(w, arguments);\n      };\n      delete window[name];\n    });\n    mixin(Window.prototype, {\n      getComputedStyle: function(el, pseudo) {\n        renderAllPending();\n        return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n      },\n      getSelection: function() {\n        renderAllPending();\n        return new Selection(originalGetSelection.call(unwrap(this)));\n      },\n      get document() {\n        return wrap(unwrap(this).document);\n      }\n    });\n    if (originalGetDefaultComputedStyle) {\n      Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n        renderAllPending();\n        return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);\n      };\n    }\n    registerWrapper(OriginalWindow, Window, window);\n    scope.wrappers.Window = Window;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var unwrap = scope.unwrap;\n    var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n    var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;\n    if (OriginalDataTransferSetDragImage) {\n      OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n        OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n      };\n    }\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var registerWrapper = scope.registerWrapper;\n    var setWrapper = scope.setWrapper;\n    var unwrap = scope.unwrap;\n    var OriginalFormData = window.FormData;\n    if (!OriginalFormData) return;\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    registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n    scope.wrappers.FormData = FormData;\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var unwrapIfNeeded = scope.unwrapIfNeeded;\n    var originalSend = XMLHttpRequest.prototype.send;\n    XMLHttpRequest.prototype.send = function(obj) {\n      return originalSend.call(this, unwrapIfNeeded(obj));\n    };\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    \"use strict\";\n    var isWrapperFor = scope.isWrapperFor;\n    var elements = {\n      a: \"HTMLAnchorElement\",\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      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      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    function overrideConstructor(tagName) {\n      var nativeConstructorName = elements[tagName];\n      var nativeConstructor = window[nativeConstructorName];\n      if (!nativeConstructor) return;\n      var element = document.createElement(tagName);\n      var wrapperConstructor = element.constructor;\n      window[nativeConstructorName] = wrapperConstructor;\n    }\n    Object.keys(elements).forEach(overrideConstructor);\n    Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n      window[name] = scope.wrappers[name];\n    });\n  })(window.ShadowDOMPolyfill);\n  (function(scope) {\n    var ShadowCSS = {\n      strictStyling: false,\n      registry: {},\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        var cssText = stylesToCssText(scopeStyles, true);\n        cssText = this.scopeCssText(cssText, scopeSelector);\n        if (root) {\n          root.shimmedStyle = cssText;\n        }\n        this.addCssToDocument(cssText, name);\n      },\n      shimStyle: function(style, selector) {\n        return this.shimCssText(style.textContent, selector);\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        this.removeStyles(root, def.rootStyles);\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          Array.prototype.forEach.call(root.querySelectorAll(\"*\"), function(node) {\n            node.setAttribute(name, \"\");\n          });\n          Array.prototype.forEach.call(root.querySelectorAll(\"template\"), function(template) {\n            this.applyScopeToContent(template.content, name);\n          }, this);\n        }\n      },\n      insertDirectives: function(cssText) {\n        cssText = this.insertPolyfillDirectivesInCssText(cssText);\n        return this.insertPolyfillRulesInCssText(cssText);\n      },\n      insertPolyfillDirectivesInCssText: function(cssText) {\n        cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n          return p1.slice(0, -2) + \"{\";\n        });\n        return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n          return p1 + \" {\";\n        });\n      },\n      insertPolyfillRulesInCssText: function(cssText) {\n        cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\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      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        cssText = cssText + \"\\n\" + unscoped;\n        return cssText.trim();\n      },\n      extractUnscopedRulesFromCssText: function(cssText) {\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      convertColonHost: function(cssText) {\n        return this.convertColonRule(cssText, cssColonHostRe, this.colonHostPartReplacer);\n      },\n      convertColonHostContext: function(cssText) {\n        return this.convertColonRule(cssText, cssColonHostContextRe, this.colonHostContextPartReplacer);\n      },\n      convertColonRule: function(cssText, regExp, partReplacer) {\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      convertShadowDOMSelectors: function(cssText) {\n        for (var i = 0; i < shadowDOMSelectorsRe.length; i++) {\n          cssText = cssText.replace(shadowDOMSelectorsRe[i], \" \");\n        }\n        return cssText;\n      },\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, 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              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) ? this.applyStrictSelectorScope(p, scopeSelector) : 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) ? this.applySelectorScopeList(selector, selectorScope) : this.applySimpleSelectorScope(selector, selectorScope);\n      },\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      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      applyStrictSelectorScope: function(selector, scopeSelector) {\n        scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, \"$1\");\n        var splits = [ \" \", \">\", \"+\", \"~\" ], scoped = selector, attrName = \"[\" + scopeSelector + \"]\";\n        splits.forEach(function(sep) {\n          var parts = scoped.split(sep);\n          scoped = parts.map(function(p) {\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(colonHostRe, polyfillHost);\n      },\n      propertiesFromRule: function(rule) {\n        var cssText = rule.style.cssText;\n        if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n          cssText = cssText.replace(/content:[^;]*;/g, \"content: '\" + rule.style.content + \"';\");\n        }\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    var selectorRe = /([^{]*)({[\\s\\S]*?})/gim, cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim, cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim, cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim, cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim, cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim, cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim, cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim, cssPseudoRe = /::(x-[^\\s{,(]*)/gim, cssPartRe = /::part\\(([^)]*)\\)/gim, polyfillHost = \"-shadowcsshost\", polyfillHostContext = \"-shadowcsscontext\", parenSuffix = \")(?:\\\\((\" + \"(?:\\\\([^)(]*\\\\)|[^)(]*)+?\" + \")\\\\))?([^,{]*)\";\n    var cssColonHostRe = new RegExp(\"(\" + polyfillHost + parenSuffix, \"gim\"), cssColonHostContextRe = new RegExp(\"(\" + polyfillHostContext + parenSuffix, \"gim\"), selectorReSuffix = \"([>\\\\s~+[.,{:][\\\\s\\\\S]*)?$\", colonHostRe = /\\:host/gim, colonHostContextRe = /\\:host-context/gim, polyfillHostNoCombinator = polyfillHost + \"-no-combinator\", polyfillHostRe = new RegExp(polyfillHost, \"gim\"), polyfillHostContextRe = new RegExp(polyfillHostContext, \"gim\"), shadowDOMSelectorsRe = [ /\\^\\^/g, /\\^/g, /\\/shadow\\//g, /\\/shadow-deep\\//g, /::shadow/g, /\\/deep\\//g, /::content/g ];\n    function stylesToCssText(styles, preserveComments) {\n      var cssText = \"\";\n      Array.prototype.forEach.call(styles, function(s) {\n        cssText += s.textContent + \"\\n\\n\";\n      });\n      if (!preserveComments) {\n        cssText = cssText.replace(cssCommentRe, \"\");\n      }\n      return cssText;\n    }\n    function cssTextToStyle(cssText) {\n      var style = document.createElement(\"style\");\n      style.textContent = cssText;\n      return style;\n    }\n    function cssToRules(cssText) {\n      var style = cssTextToStyle(cssText);\n      document.head.appendChild(style);\n      var rules = [];\n      if (style.sheet) {\n        try {\n          rules = style.sheet.cssRules;\n        } catch (e) {}\n      } else {\n        console.warn(\"sheet not found\", style);\n      }\n      style.parentNode.removeChild(style);\n      return rules;\n    }\n    var frame = document.createElement(\"iframe\");\n    frame.style.display = \"none\";\n    function 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    function 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    var isChrome = navigator.userAgent.match(\"Chrome\");\n    function 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    function 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    function addCssToDocument(cssText) {\n      if (cssText) {\n        getSheet().appendChild(document.createTextNode(cssText));\n      }\n    }\n    function addOwnSheet(cssText, name) {\n      var style = cssTextToStyle(cssText);\n      style.setAttribute(name, \"\");\n      style.setAttribute(SHIMMED_ATTRIBUTE, \"\");\n      document.head.appendChild(style);\n    }\n    var SHIM_ATTRIBUTE = \"shim-shadowdom\";\n    var SHIMMED_ATTRIBUTE = \"shim-shadowdom-css\";\n    var NO_SHIM_ATTRIBUTE = \"no-shim\";\n    var sheet;\n    function 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    if (window.ShadowDOMPolyfill) {\n      addCssToDocument(\"style { display: none !important; }\\n\");\n      var doc = ShadowDOMPolyfill.wrap(document);\n      var head = doc.querySelector(\"head\");\n      head.insertBefore(getSheet(), head.childNodes[0]);\n      document.addEventListener(\"DOMContentLoaded\", function() {\n        var urlResolver = scope.urlResolver;\n        if (window.HTMLImports && !HTMLImports.useNative) {\n          var SHIM_SHEET_SELECTOR = \"link[rel=stylesheet]\" + \"[\" + 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          HTMLImports.parser.documentSelectors = [ HTMLImports.parser.documentSelectors, SHIM_SHEET_SELECTOR, SHIM_STYLE_SELECTOR ].join(\",\");\n          var originalParseGeneric = HTMLImports.parser.parseGeneric;\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            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            if (style.parentNode !== 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          var hasResource = HTMLImports.parser.hasResource;\n          HTMLImports.parser.hasResource = function(node) {\n            if (node.localName === \"link\" && node.rel === \"stylesheet\" && node.hasAttribute(SHIM_ATTRIBUTE)) {\n              return node.__resource;\n            } else {\n              return hasResource.call(this, node);\n            }\n          };\n        }\n      });\n    }\n    scope.ShadowCSS = ShadowCSS;\n  })(window.WebComponents);\n}\n\n(function(scope) {\n  if (window.ShadowDOMPolyfill) {\n    window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n    window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n  } else {\n    window.wrap = window.unwrap = function(n) {\n      return n;\n    };\n  }\n})(window.WebComponents);\n\n(function(global) {\n  var registrationsTable = new WeakMap();\n  var setImmediate;\n  if (/Trident|Edge/.test(navigator.userAgent)) {\n    setImmediate = setTimeout;\n  } else if (window.setImmediate) {\n    setImmediate = window.setImmediate;\n  } else {\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  var isScheduled = false;\n  var scheduledObservers = [];\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n  }\n  function dispatchCallbacks() {\n    isScheduled = false;\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n      var queue = observer.takeRecords();\n      removeTransientObserversFor(observer);\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n    if (anyNonEmpty) dispatchCallbacks();\n  }\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations) return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer) registration.removeTransientObservers();\n      });\n    });\n  }\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n          if (node !== target && !options.subtree) continue;\n          var record = callback(options);\n          if (record) registration.enqueue(record);\n        }\n      }\n    }\n  }\n  var uidCounter = 0;\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n        throw new SyntaxError();\n      }\n      var registrations = registrationsTable.get(target);\n      if (!registrations) registrationsTable.set(target, registrations = []);\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      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n      registration.addListeners();\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            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\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  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  var currentRecord, recordWithOldValue;\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue) return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord) return lastRecord;\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;\n    return null;\n  }\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\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      records[length] = record;\n    },\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n      if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n      if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n      if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n    },\n    addTransientObserver: function(node) {\n      if (node === this.target) return;\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations) registrationsTable.set(node, registrations = []);\n      registrations.push(this);\n    },\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n      transientObservedNodes.forEach(function(node) {\n        this.removeListeners_(node);\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            break;\n          }\n        }\n      }, this);\n    },\n    handleEvent: function(e) {\n      e.stopImmediatePropagation();\n      switch (e.type) {\n       case \"DOMAttrModified\":\n        var name = e.attrName;\n        var namespace = e.relatedNode.namespaceURI;\n        var target = e.target;\n        var record = new getRecord(\"attributes\", target);\n        record.attributeName = name;\n        record.attributeNamespace = namespace;\n        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.attributes) return;\n          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n            return;\n          }\n          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMCharacterDataModified\":\n        var target = e.target;\n        var record = getRecord(\"characterData\", target);\n        var oldValue = e.prevValue;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.characterData) return;\n          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n          return record;\n        });\n        break;\n\n       case \"DOMNodeRemoved\":\n        this.addTransientObserver(e.target);\n\n       case \"DOMNodeInserted\":\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          addedNodes = [];\n          removedNodes = [ changedNode ];\n        }\n        var previousSibling = changedNode.previousSibling;\n        var nextSibling = changedNode.nextSibling;\n        var record = getRecord(\"childList\", target);\n        record.addedNodes = addedNodes;\n        record.removedNodes = removedNodes;\n        record.previousSibling = previousSibling;\n        record.nextSibling = nextSibling;\n        forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n          if (!options.childList) return;\n          return record;\n        });\n      }\n      clearRecords();\n    }\n  };\n  global.JsMutationObserver = JsMutationObserver;\n  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;\n})(this);\n\nwindow.HTMLImports = window.HTMLImports || {\n  flags: {}\n};\n\n(function(scope) {\n  var IMPORT_LINK_TYPE = \"import\";\n  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement(\"link\"));\n  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\n  var wrap = function(node) {\n    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n  };\n  var rootDocument = wrap(document);\n  var currentScriptDescriptor = {\n    get: function() {\n      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== \"complete\" ? document.scripts[document.scripts.length - 1] : null);\n      return wrap(script);\n    },\n    configurable: true\n  };\n  Object.defineProperty(document, \"_currentScript\", currentScriptDescriptor);\n  Object.defineProperty(rootDocument, \"_currentScript\", currentScriptDescriptor);\n  var isIE = /Trident|Edge/.test(navigator.userAgent);\n  function whenReady(callback, doc) {\n    doc = doc || rootDocument;\n    whenDocumentReady(function() {\n      watchImportsLoad(callback, doc);\n    }, doc);\n  }\n  var requiredReadyState = isIE ? \"complete\" : \"interactive\";\n  var READY_EVENT = \"readystatechange\";\n  function isDocumentReady(doc) {\n    return doc.readyState === \"complete\" || doc.readyState === requiredReadyState;\n  }\n  function whenDocumentReady(callback, doc) {\n    if (!isDocumentReady(doc)) {\n      var checkReady = function() {\n        if (doc.readyState === \"complete\" || 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  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n  function 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 && callback) {\n        callback();\n      }\n    }\n    function loadedImport(e) {\n      markTargetLoaded(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            target: imp\n          });\n        } else {\n          imp.addEventListener(\"load\", loadedImport);\n          imp.addEventListener(\"error\", loadedImport);\n        }\n      }\n    } else {\n      checkDone();\n    }\n  }\n  function isImportLoaded(link) {\n    return useNative ? link.__loaded || link.import && link.import.readyState !== \"loading\" : link.__importParsed;\n  }\n  if (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, {\n      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    function isImport(element) {\n      return element.localName === \"link\" && element.rel === \"import\";\n    }\n    function handleImport(element) {\n      var loaded = element.import;\n      if (loaded) {\n        markTargetLoaded({\n          target: element\n        });\n      } else {\n        element.addEventListener(\"load\", markTargetLoaded);\n        element.addEventListener(\"error\", markTargetLoaded);\n      }\n    }\n    (function() {\n      if (document.readyState === \"loading\") {\n        var imports = document.querySelectorAll(\"link[rel=import]\");\n        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {\n          handleImport(imp);\n        }\n      }\n    })();\n  }\n  whenReady(function() {\n    HTMLImports.ready = true;\n    HTMLImports.readyTime = new Date().getTime();\n    rootDocument.dispatchEvent(new CustomEvent(\"HTMLImportsLoaded\", {\n      bubbles: true\n    }));\n  });\n  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n  scope.useNative = useNative;\n  scope.rootDocument = rootDocument;\n  scope.whenReady = whenReady;\n  scope.isIE = isIE;\n})(HTMLImports);\n\n(function(scope) {\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n})(HTMLImports);\n\nHTMLImports.addModule(function(scope) {\n  var CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\n  var CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n  var 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  scope.path = path;\n});\n\nHTMLImports.addModule(function(scope) {\n  xhr = {\n    async: true,\n    ok: function(request) {\n      return request.status >= 200 && request.status < 300 || request.status === 304 || 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          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = locationHeader.substr(0, 1) === \"/\" ? location.origin + locationHeader : locationHeader;\n          }\n          next.call(nextContext, !xhr.ok(request) && request, 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  scope.xhr = xhr;\n});\n\nHTMLImports.addModule(function(scope) {\n  var xhr = scope.xhr;\n  var flags = scope.flags;\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  Loader.prototype = {\n    addNodes: function(nodes) {\n      this.inflight += nodes.length;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        this.require(n);\n      }\n      this.checkDone();\n    },\n    addNode: function(node) {\n      this.inflight++;\n      this.require(node);\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      elt.__nodeUrl = url;\n      if (!this.dedupe(url, elt)) {\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        this.pending[url].push(elt);\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        this.tail();\n        return true;\n      }\n      this.pending[url] = [ elt ];\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log(\"fetch\", url, elt);\n      if (url.match(/^data:/)) {\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      }\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        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  scope.Loader = Loader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var Observer = function(addCallback) {\n    this.addCallback = addCallback;\n    this.mo = new MutationObserver(this.handler.bind(this));\n  };\n  Observer.prototype = {\n    handler: function(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          this.addedNodes(m.addedNodes);\n        }\n      }\n    },\n    addedNodes: function(nodes) {\n      if (this.addCallback) {\n        this.addCallback(nodes);\n      }\n      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {\n        if (n.children && n.children.length) {\n          this.addedNodes(n.children);\n        }\n      }\n    },\n    observe: function(root) {\n      this.mo.observe(root, {\n        childList: true,\n        subtree: true\n      });\n    }\n  };\n  scope.Observer = Observer;\n});\n\nHTMLImports.addModule(function(scope) {\n  var path = scope.path;\n  var rootDocument = scope.rootDocument;\n  var flags = scope.flags;\n  var isIE = scope.isIE;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = \"link[rel=\" + IMPORT_LINK_TYPE + \"]\";\n  var importParser = {\n    documentSelectors: IMPORT_SELECTOR,\n    importsSelectors: [ IMPORT_SELECTOR, \"link[rel=stylesheet]\", \"style\", \"script:not([type])\", 'script[type=\"text/javascript\"]' ].join(\",\"),\n    map: {\n      link: \"parseLink\",\n      script: \"parseScript\",\n      style: \"parseStyle\"\n    },\n    dynamicElements: [],\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    parseDynamic: function(elt, quiet) {\n      this.dynamicElements.push(elt);\n      if (!quiet) {\n        this.parseNext();\n      }\n    },\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      this.markDynamicParsingComplete(elt);\n      if (elt.__importElement) {\n        elt.__importElement.__importParsed = true;\n        this.markDynamicParsingComplete(elt.__importElement);\n      }\n      this.parsingElement = null;\n      flags.parse && console.log(\"completed\", elt);\n    },\n    markDynamicParsingComplete: function(elt) {\n      var i = this.dynamicElements.indexOf(elt);\n      if (i >= 0) {\n        this.dynamicElements.splice(i, 1);\n      }\n    },\n    parseImport: function(elt) {\n      if (HTMLImports.__importsParsingHook) {\n        HTMLImports.__importsParsingHook(elt);\n      }\n      if (elt.import) {\n        elt.import.__importParsed = true;\n      }\n      this.markParsingComplete(elt);\n      if (elt.__resource && !elt.__error) {\n        elt.dispatchEvent(new CustomEvent(\"load\", {\n          bubbles: false\n        }));\n      } else {\n        elt.dispatchEvent(new CustomEvent(\"error\", {\n          bubbles: false\n        }));\n      }\n      if (elt.__pending) {\n        var fn;\n        while (elt.__pending.length) {\n          fn = elt.__pending.shift();\n          if (fn) {\n            fn({\n              target: elt\n            });\n          }\n        }\n      }\n      this.parseNext();\n    },\n    parseLink: function(linkElt) {\n      if (nodeIsImport(linkElt)) {\n        this.parseImport(linkElt);\n      } else {\n        linkElt.href = linkElt.href;\n        this.parseGeneric(linkElt);\n      }\n    },\n    parseStyle: function(elt) {\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      port.parentNode.insertBefore(elt, port);\n    },\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      if (isIE && elt.localName === \"style\") {\n        var fakeLoad = false;\n        if (elt.textContent.indexOf(\"@import\") == -1) {\n          fakeLoad = true;\n        } else if (elt.sheet) {\n          fakeLoad = true;\n          var csr = elt.sheet.cssRules;\n          var len = csr ? csr.length : 0;\n          for (var i = 0, r; i < len && (r = csr[i]); i++) {\n            if (r.type === CSSRule.IMPORT_RULE) {\n              fakeLoad = fakeLoad && Boolean(r.styleSheet);\n            }\n          }\n        }\n        if (fakeLoad) {\n          elt.dispatchEvent(new CustomEvent(\"load\", {\n            bubbles: false\n          }));\n        }\n      }\n    },\n    parseScript: function(scriptElt) {\n      var script = document.createElement(\"script\");\n      script.__importElement = scriptElt;\n      script.src = scriptElt.src ? scriptElt.src : 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    nextToParse: function() {\n      this._mayParse = [];\n      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());\n    },\n    nextToParseInDoc: function(doc, link) {\n      if (doc && this._mayParse.indexOf(doc) < 0) {\n        this._mayParse.push(doc);\n        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n        for (var i = 0, l = nodes.length, p = 0, n; i < l && (n = nodes[i]); i++) {\n          if (!this.isParsed(n)) {\n            if (this.hasResource(n)) {\n              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n            } else {\n              return;\n            }\n          }\n        }\n      }\n      return link;\n    },\n    nextToParseDynamic: function() {\n      return this.dynamicElements[0];\n    },\n    parseSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;\n    },\n    isParsed: function(node) {\n      return node.__importParsed;\n    },\n    needsDynamicParsing: function(elt) {\n      return this.dynamicElements.indexOf(elt) >= 0;\n    },\n    hasResource: function(node) {\n      if (nodeIsImport(node) && node.import === undefined) {\n        return false;\n      }\n      return true;\n    }\n  };\n  function nodeIsImport(elt) {\n    return elt.localName === \"link\" && elt.rel === IMPORT_LINK_TYPE;\n  }\n  function generateScriptDataUrl(script) {\n    var scriptContent = generateScriptContent(script);\n    return \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(scriptContent);\n  }\n  function generateScriptContent(script) {\n    return script.textContent + generateSourceMapHint(script);\n  }\n  function generateSourceMapHint(script) {\n    var owner = script.ownerDocument;\n    owner.__importedScripts = owner.__importedScripts || 0;\n    var moniker = script.ownerDocument.baseURI;\n    var num = owner.__importedScripts ? \"-\" + owner.__importedScripts : \"\";\n    owner.__importedScripts++;\n    return \"\\n//# sourceURL=\" + moniker + num + \".js\\n\";\n  }\n  function cloneStyle(style) {\n    var clone = style.ownerDocument.createElement(\"style\");\n    clone.textContent = style.textContent;\n    path.resolveUrlsInStyle(clone);\n    return clone;\n  }\n  scope.parser = importParser;\n  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;\n});\n\nHTMLImports.addModule(function(scope) {\n  var flags = scope.flags;\n  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;\n  var rootDocument = scope.rootDocument;\n  var Loader = scope.Loader;\n  var Observer = scope.Observer;\n  var parser = scope.parser;\n  var importer = {\n    documents: {},\n    documentPreloadSelectors: IMPORT_SELECTOR,\n    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(\",\"),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log(\"loaded\", url, elt);\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isImportLink(elt)) {\n        var doc = this.documents[url];\n        if (doc === undefined) {\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            this.bootDocument(doc);\n          }\n          this.documents[url] = doc;\n        }\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observer.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));\n  importer.observer = new Observer();\n  function isImportLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n  function isLinkRel(elt, rel) {\n    return elt.localName === \"link\" && elt.getAttribute(\"rel\") === rel;\n  }\n  function makeDocument(resource, url) {\n    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    doc._URL = url;\n    var base = doc.createElement(\"base\");\n    base.setAttribute(\"href\", url);\n    if (!doc.baseURI) {\n      Object.defineProperty(doc, \"baseURI\", {\n        value: url\n      });\n    }\n    var meta = doc.createElement(\"meta\");\n    meta.setAttribute(\"charset\", \"utf-8\");\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    doc.body.innerHTML = resource;\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\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    Object.defineProperty(document, \"baseURI\", baseURIDescriptor);\n    Object.defineProperty(rootDocument, \"baseURI\", baseURIDescriptor);\n  }\n  scope.importer = importer;\n  scope.importLoader = importLoader;\n});\n\nHTMLImports.addModule(function(scope) {\n  var parser = scope.parser;\n  var importer = scope.importer;\n  var dynamic = {\n    added: function(nodes) {\n      var owner, parsed;\n      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {\n        if (!owner) {\n          owner = n.ownerDocument;\n          parsed = parser.isParsed(owner);\n        }\n        loading = this.shouldLoadNode(n);\n        if (loading) {\n          importer.loadNode(n);\n        }\n        if (this.shouldParseNode(n) && parsed) {\n          parser.parseDynamic(n, loading);\n        }\n      }\n    },\n    shouldLoadNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));\n    },\n    shouldParseNode: function(node) {\n      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));\n    }\n  };\n  importer.observer.addCallback = dynamic.added.bind(dynamic);\n  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;\n});\n\n(function(scope) {\n  var initializeModules = scope.initializeModules;\n  var isIE = scope.isIE;\n  if (scope.useNative) {\n    return;\n  }\n  if (isIE && 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  initializeModules();\n  var rootDocument = scope.rootDocument;\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(rootDocument);\n  }\n  if (document.readyState === \"complete\" || document.readyState === \"interactive\" && !window.attachEvent) {\n    bootstrap();\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", bootstrap);\n  }\n})(HTMLImports);\n\nwindow.CustomElements = window.CustomElements || {\n  flags: {}\n};\n\n(function(scope) {\n  var flags = scope.flags;\n  var modules = [];\n  var addModule = function(module) {\n    modules.push(module);\n  };\n  var initializeModules = function() {\n    modules.forEach(function(module) {\n      module(scope);\n    });\n  };\n  scope.addModule = addModule;\n  scope.initializeModules = initializeModules;\n  scope.hasNative = Boolean(document.registerElement);\n  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n})(CustomElements);\n\nCustomElements.addModule(function(scope) {\n  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : \"none\";\n  function forSubtree(node, cb) {\n    findAllElements(node, function(e) {\n      if (cb(e)) {\n        return true;\n      }\n      forRoots(e, cb);\n    });\n    forRoots(node, cb);\n  }\n  function findAllElements(node, find, data) {\n    var e = node.firstElementChild;\n    if (!e) {\n      e = node.firstChild;\n      while (e && e.nodeType !== Node.ELEMENT_NODE) {\n        e = e.nextSibling;\n      }\n    }\n    while (e) {\n      if (find(e, data) !== true) {\n        findAllElements(e, find, data);\n      }\n      e = e.nextElementSibling;\n    }\n    return null;\n  }\n  function forRoots(node, cb) {\n    var root = node.shadowRoot;\n    while (root) {\n      forSubtree(root, cb);\n      root = root.olderShadowRoot;\n    }\n  }\n  var processingDocuments;\n  function forDocumentTree(doc, cb) {\n    processingDocuments = [];\n    _forDocumentTree(doc, cb);\n    processingDocuments = null;\n  }\n  function _forDocumentTree(doc, cb) {\n    doc = wrap(doc);\n    if (processingDocuments.indexOf(doc) >= 0) {\n      return;\n    }\n    processingDocuments.push(doc);\n    var imports = doc.querySelectorAll(\"link[rel=\" + IMPORT_LINK_TYPE + \"]\");\n    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {\n      if (n.import) {\n        _forDocumentTree(n.import, cb);\n      }\n    }\n    cb(doc);\n  }\n  scope.forDocumentTree = forDocumentTree;\n  scope.forSubtree = forSubtree;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  var forSubtree = scope.forSubtree;\n  var forDocumentTree = scope.forDocumentTree;\n  function addedNode(node) {\n    return added(node) || addedSubtree(node);\n  }\n  function added(node) {\n    if (scope.upgrade(node)) {\n      return true;\n    }\n    attached(node);\n  }\n  function addedSubtree(node) {\n    forSubtree(node, function(e) {\n      if (added(e)) {\n        return true;\n      }\n    });\n  }\n  function attachedNode(node) {\n    attached(node);\n    if (inDocument(node)) {\n      forSubtree(node, function(e) {\n        attached(e);\n      });\n    }\n  }\n  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;\n  scope.hasPolyfillMutations = hasPolyfillMutations;\n  var isPendingMutations = false;\n  var pendingMutations = [];\n  function deferMutation(fn) {\n    pendingMutations.push(fn);\n    if (!isPendingMutations) {\n      isPendingMutations = true;\n      setTimeout(takeMutations);\n    }\n  }\n  function takeMutations() {\n    isPendingMutations = false;\n    var $p = pendingMutations;\n    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {\n      p();\n    }\n    pendingMutations = [];\n  }\n  function attached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _attached(element);\n      });\n    } else {\n      _attached(element);\n    }\n  }\n  function _attached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (!element.__attached && inDocument(element)) {\n        element.__attached = true;\n        if (element.attachedCallback) {\n          element.attachedCallback();\n        }\n      }\n    }\n  }\n  function detachedNode(node) {\n    detached(node);\n    forSubtree(node, function(e) {\n      detached(e);\n    });\n  }\n  function detached(element) {\n    if (hasPolyfillMutations) {\n      deferMutation(function() {\n        _detached(element);\n      });\n    } else {\n      _detached(element);\n    }\n  }\n  function _detached(element) {\n    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {\n      if (element.__attached && !inDocument(element)) {\n        element.__attached = false;\n        if (element.detachedCallback) {\n          element.detachedCallback();\n        }\n      }\n    }\n  }\n  function inDocument(element) {\n    var p = element;\n    var doc = wrap(document);\n    while (p) {\n      if (p == doc) {\n        return true;\n      }\n      p = p.parentNode || p.host;\n    }\n  }\n  function watchShadow(node) {\n    if (node.shadowRoot && !node.shadowRoot.__watched) {\n      flags.dom && console.log(\"watching shadow-root for: \", node.localName);\n      var root = node.shadowRoot;\n      while (root) {\n        observe(root);\n        root = root.olderShadowRoot;\n      }\n    }\n  }\n  function handler(mutations) {\n    if (flags.dom) {\n      var mx = mutations[0];\n      if (mx && mx.type === \"childList\" && mx.addedNodes) {\n        if (mx.addedNodes) {\n          var d = mx.addedNodes[0];\n          while (d && d !== document && !d.host) {\n            d = d.parentNode;\n          }\n          var u = d && (d.URL || d._URL || d.host && d.host.localName) || \"\";\n          u = u.split(\"/?\").shift().split(\"/\").pop();\n        }\n      }\n      console.group(\"mutations (%d) [%s]\", mutations.length, u || \"\");\n    }\n    mutations.forEach(function(mx) {\n      if (mx.type === \"childList\") {\n        forEach(mx.addedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          addedNode(n);\n        });\n        forEach(mx.removedNodes, function(n) {\n          if (!n.localName) {\n            return;\n          }\n          detachedNode(n);\n        });\n      }\n    });\n    flags.dom && console.groupEnd();\n  }\n  function takeRecords(node) {\n    node = wrap(node);\n    if (!node) {\n      node = wrap(document);\n    }\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    var observer = node.__observer;\n    if (observer) {\n      handler(observer.takeRecords());\n      takeMutations();\n    }\n  }\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  function observe(inRoot) {\n    if (inRoot.__observer) {\n      return;\n    }\n    var observer = new MutationObserver(handler);\n    observer.observe(inRoot, {\n      childList: true,\n      subtree: true\n    });\n    inRoot.__observer = observer;\n  }\n  function upgradeDocument(doc) {\n    doc = wrap(doc);\n    flags.dom && console.group(\"upgradeDocument: \", doc.baseURI.split(\"/\").pop());\n    addedNode(doc);\n    observe(doc);\n    flags.dom && console.groupEnd();\n  }\n  function upgradeDocumentTree(doc) {\n    forDocumentTree(doc, upgradeDocument);\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  scope.watchShadow = watchShadow;\n  scope.upgradeDocumentTree = upgradeDocumentTree;\n  scope.upgradeSubtree = addedSubtree;\n  scope.upgradeAll = addedNode;\n  scope.attachedNode = attachedNode;\n  scope.takeRecords = takeRecords;\n});\n\nCustomElements.addModule(function(scope) {\n  var flags = scope.flags;\n  function upgrade(node) {\n    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\n      var is = node.getAttribute(\"is\");\n      var definition = scope.getRegisteredDefinition(is || node.localName);\n      if (definition) {\n        if (is && definition.tag == node.localName) {\n          return upgradeWithDefinition(node, definition);\n        } else if (!is && !definition.extends) {\n          return upgradeWithDefinition(node, definition);\n        }\n      }\n    }\n  }\n  function upgradeWithDefinition(element, definition) {\n    flags.upgrade && console.group(\"upgrade:\", element.localName);\n    if (definition.is) {\n      element.setAttribute(\"is\", definition.is);\n    }\n    implementPrototype(element, definition);\n    element.__upgraded__ = true;\n    created(element);\n    scope.attachedNode(element);\n    scope.upgradeSubtree(element);\n    flags.upgrade && console.groupEnd();\n    return element;\n  }\n  function implementPrototype(element, definition) {\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n  function customMixin(inTarget, inSrc, inNative) {\n    var used = {};\n    var p = inSrc;\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, Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n  function created(element) {\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n  scope.upgrade = upgrade;\n  scope.upgradeWithDefinition = upgradeWithDefinition;\n  scope.implementPrototype = implementPrototype;\n});\n\nCustomElements.addModule(function(scope) {\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  var upgrade = scope.upgrade;\n  var upgradeWithDefinition = scope.upgradeWithDefinition;\n  var implementPrototype = scope.implementPrototype;\n  var useNative = scope.useNative;\n  function register(name, options) {\n    var definition = options || {};\n    if (!name) {\n      throw new Error(\"document.registerElement: first argument `name` must not be empty\");\n    }\n    if (name.indexOf(\"-\") < 0) {\n      throw new Error(\"document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '\" + String(name) + \"'.\");\n    }\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    if (getRegisteredDefinition(name)) {\n      throw new Error(\"DuplicateDefinitionError: a type with name '\" + String(name) + \"' is already registered\");\n    }\n    if (!definition.prototype) {\n      definition.prototype = Object.create(HTMLElement.prototype);\n    }\n    definition.__name = name.toLowerCase();\n    definition.lifecycle = definition.lifecycle || {};\n    definition.ancestry = ancestry(definition.extends);\n    resolveTagName(definition);\n    resolvePrototypeChain(definition);\n    overrideAttributeApi(definition.prototype);\n    registerDefinition(definition.__name, definition);\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    definition.prototype.constructor = definition.ctor;\n    if (scope.ready) {\n      upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n  function overrideAttributeApi(prototype) {\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  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 && newValue !== oldValue) {\n      this.attributeChangedCallback(name, oldValue, newValue);\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  var reservedTagList = [ \"annotation-xml\", \"color-profile\", \"font-face\", \"font-face-src\", \"font-face-uri\", \"font-face-format\", \"font-face-name\", \"missing-glyph\" ];\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([ extendee ]);\n    }\n    return [];\n  }\n  function resolveTagName(definition) {\n    var baseTag = definition.extends;\n    for (var i = 0, a; a = definition.ancestry[i]; i++) {\n      baseTag = a.is && a.tag;\n    }\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      definition.is = definition.__name;\n    }\n  }\n  function resolvePrototypeChain(definition) {\n    if (!Object.__proto__) {\n      var nativePrototype = HTMLElement.prototype;\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\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      definition.native = nativePrototype;\n    }\n  }\n  function instantiate(definition) {\n    return upgradeWithDefinition(domCreateElement(definition.tag), definition);\n  }\n  var registry = {};\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n  var HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n  function createElementNS(namespace, tag, typeExtension) {\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n  function createElement(tag, typeExtension) {\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n    var element;\n    if (typeExtension) {\n      element = createElement(tag);\n      element.setAttribute(\"is\", typeExtension);\n      return element;\n    }\n    element = domCreateElement(tag);\n    if (tag.indexOf(\"-\") >= 0) {\n      implementPrototype(element, HTMLElement);\n    }\n    return element;\n  }\n  function cloneNode(deep) {\n    var n = domCloneNode.call(this, deep);\n    upgrade(n);\n    return n;\n  }\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n  var domCloneNode = Node.prototype.cloneNode;\n  var isInstance;\n  if (!Object.__proto__ && !useNative) {\n    isInstance = function(obj, ctor) {\n      var p = obj;\n      while (p) {\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  document.registerElement = register;\n  document.createElement = createElement;\n  document.createElementNS = createElementNS;\n  Node.prototype.cloneNode = cloneNode;\n  scope.registry = registry;\n  scope.instanceof = isInstance;\n  scope.reservedTagList = reservedTagList;\n  scope.getRegisteredDefinition = getRegisteredDefinition;\n  document.register = document.registerElement;\n});\n\n(function(scope) {\n  var useNative = scope.useNative;\n  var initializeModules = scope.initializeModules;\n  var isIE11OrOlder = /Trident/.test(navigator.userAgent);\n  if (useNative) {\n    var nop = function() {};\n    scope.watchShadow = nop;\n    scope.upgrade = nop;\n    scope.upgradeAll = nop;\n    scope.upgradeDocumentTree = nop;\n    scope.upgradeSubtree = nop;\n    scope.takeRecords = nop;\n    scope.instanceof = function(obj, base) {\n      return obj instanceof base;\n    };\n  } else {\n    initializeModules();\n  }\n  var upgradeDocumentTree = scope.upgradeDocumentTree;\n  if (!window.wrap) {\n    if (window.ShadowDOMPolyfill) {\n      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n    } else {\n      window.wrap = window.unwrap = function(node) {\n        return node;\n      };\n    }\n  }\n  function bootstrap() {\n    upgradeDocumentTree(wrap(document));\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        upgradeDocumentTree(wrap(elt.import));\n      };\n    }\n    CustomElements.ready = true;\n    setTimeout(function() {\n      CustomElements.readyTime = Date.now();\n      if (window.HTMLImports) {\n        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n      }\n      document.dispatchEvent(new CustomEvent(\"WebComponentsReady\", {\n        bubbles: true\n      }));\n    });\n  }\n  if (isIE11OrOlder && 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  if (document.readyState === \"complete\" || scope.flags.eager) {\n    bootstrap();\n  } else if (document.readyState === \"interactive\" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {\n    bootstrap();\n  } else {\n    var loadEvent = window.HTMLImports && !HTMLImports.ready ? \"HTMLImportsLoaded\" : \"DOMContentLoaded\";\n    window.addEventListener(loadEvent, bootstrap);\n  }\n})(window.CustomElements);\n\n(function(scope) {\n  if (!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})(window.WebComponents);\n\n(function(scope) {\n  \"use strict\";\n  if (!window.performance) {\n    var start = Date.now();\n    window.performance = {\n      now: function() {\n        return Date.now() - start;\n      }\n    };\n  }\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = function() {\n      var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n      return nativeRaf ? function(callback) {\n        return nativeRaf(function() {\n          callback(performance.now());\n        });\n      } : function(callback) {\n        return window.setTimeout(callback, 1e3 / 60);\n      };\n    }();\n  }\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = function() {\n      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {\n        clearTimeout(id);\n      };\n    }();\n  }\n  var elementDeclarations = [];\n  var polymerStub = function(name, dictionary) {\n    if (typeof name !== \"string\" && arguments.length === 1) {\n      Array.prototype.push.call(arguments, document._currentScript);\n    }\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n  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  function installPolymerWarning() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        throw new Error(\"You tried to use polymer without loading it first. To \" + 'load polymer, <link rel=\"import\" href=\"' + 'components/polymer/polymer.html\">');\n      };\n    }\n  }\n  if (HTMLImports.useNative) {\n    installPolymerWarning();\n  } else {\n    addEventListener(\"DOMContentLoaded\", installPolymerWarning);\n  }\n})(window.WebComponents);\n\n(function(scope) {\n  var style = document.createElement(\"style\");\n  style.textContent = \"\" + \"body {\" + \"transition: opacity ease-in 0.2s;\" + \" } \\n\" + \"body[unresolved] {\" + \"opacity: 0; display: block; overflow: hidden; position: relative;\" + \" } \\n\";\n  var head = document.querySelector(\"head\");\n  head.insertBefore(style, head.firstChild);\n})(window.WebComponents);\n\n(function(scope) {\n  window.Platform = scope;\n})(window.WebComponents);"
  },
  {
    "path": "src/mui/mui-button/mui-button.html",
    "content": "<!--\n  `mui-button`\n  @version 1.0.0-alpha2\n  @description MUI button abstraction. Using icons from core-element package.\n-->\n\n<polymer-element name=\"mui-button\" attributes=\"src icon active type\"\n  on-click=\"{{buttonClicked}}\">\n  <template>\n    <style>\n      :host {\n        display: inline-block;\n        box-sizing: border-box;\n        -moz-box-sizing: border-box;\n        vertical-align: middle;\n        width: 48px;\n        height: 48px;\n        background-image: none;\n        border-radius: 2px;\n        padding: 12px 12px;\n        margin: 6px 4px;\n        font-size: 0.7rem;\n        cursor: pointer;\n        color: #546e7a;\n        box-shadow: 0 0 0 1px #b0bec5;\n      }\n      :host([disabled]) {\n        opacity: 0.6;\n        pointer-events: none;\n      }\n      /*:host(.outline) {\n        box-shadow: 0 0 0 1px ;\n      }*/\n      :host(:hover:not([disabled])) {\n        box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1), 0 0 1px 1px rgba(0, 0, 0, 0.2);\n      }\n      :host(.selected:not([disabled])) {\n        color: #03a9f4;\n        /*background-color: #039be5;*/\n        background-color: rgba(0, 0, 0, 0.15);\n        box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.24), 0 0 0 1px rgba(0, 0, 0, 0.28);\n      }\n      :host(:active:not([disabled]), .selected:active:not([disabled])) {\n        background-color: rgba(0, 0, 0, 0.1);\n        box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.24);\n      }\n      core-icon {\n        pointer-events: none;\n      }\n      .title {\n        color: #607d8b;\n        font-family: 'Roboto Condensed', sans-serif;\n        line-height: 1rem;\n        text-align: center;\n        overflow: hidden;\n        margin: 15px -4px;\n      }\n      .title(.selected) {\n        color: #fff;\n      }\n    </style>\n\n    <div>\n      <core-icon src=\"{{ src }}\" icon=\"{{ icon }}\"></core-icon>\n      <div class=\"title\">\n        {{ label }}\n      </div>\n    </div>\n\n  </template>\n\n  <script>\n\n    Polymer({\n\n      /**\n       * The URL of an image for the icon.  Should not use `icon` property\n       * if you are using this property.\n       *\n       * @attribute src\n       * @type string\n       * @default ''\n       */\n      src: '',\n\n      /**\n       * If true, border is placed around the button to indicate it's\n       * active state.\n       *\n       * @attribute active\n       * @type boolean\n       * @default false\n       */\n      active: false,\n\n      /**\n       * Specifies the icon name or index in the set of icons available in\n       * the icon set.  Should not use `src` property if you are using this\n       * property.\n       *\n       * @attribute icon\n       * @type string\n       * @default ''\n       */\n      icon: '',\n\n      // moment or toggle\n      type: 'moment',\n\n      // MUI\n      lable: 'unlabeled',\n      value: false,\n      targetParam: null,\n\n      activeChanged: function() {\n        this.classList.toggle('selected', this.active);\n      },\n\n      // if this is toggle mode, change active when clicked\n      // button => model\n      buttonClicked: function () {\n        if (this.type === 'toggle') {\n          this.active = !this.active;\n        }\n        this.value = this.active;\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method instead\n          this.targetParam.set(this.value);\n        }\n      },\n\n      // model => button\n      update: function () {\n        this.active = this.value;\n      },\n\n      loadTargetParamData: function () {\n        if (this.targetParam) {\n          this.label = this.targetParam.name;\n          this.value = this.targetParam.value;\n          this.update();\n        }\n      },\n\n      link: function (plugin, param) {\n        // get target parameter object\n        this.targetParam = plugin.params[param];\n        // load plugin param data\n        this.loadTargetParamData();\n        // setup path observer to the param\n        var ob = new PathObserver(plugin.params[param], 'value');\n        ob.open(function (newValue, oldValue) {\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n      },\n\n    });\n\n  </script>\n\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-eblock/mui-eblock.html",
    "content": "<!--\n  `mui-eblock`\n  @version 1.0.0-alpha2\n  @description MUI envelope block abstraction.\n-->\n\n<polymer-element name=\"mui-eblock\" attributes=\"type label\">\n  <template>\n    <style>\n    :host {\n      display: inline-block;\n      vertical-align: middle;\n      margin: 2px 2px;\n      width: 86px;\n      height: 70px;\n      -webkit-user-select: none;\n    }\n    .c-frame {\n      fill: #607d8b;\n      stroke: #37474f;\n      stroke-width: 2.5;\n    }\n    .c-frame-selected {\n      fill: #039be5;\n      stroke: #0277bd;\n      stroke-width: 2.5;\n    }\n    .c-line {\n      fill: rgba(255, 255, 255, 0.25);\n      stroke: #eceff1;\n      stroke-width: 1.25;\n    }\n    .c-overlay {\n      fill: #fff;\n      opacity: 0;\n    }\n    .c-overlay-flash {\n      fill: #fff;\n      -webkit-animation-name: flash;\n      -webkit-animation-duration: 0.25s;\n    }\n    @-webkit-keyframes flash {\n      from  { opacity: 0.75; }\n      to    { opacity: 0; }\n    }\n    </style>\n    <svg id=\"eTouchable\" class=\"c-svg\" width=\"86\" height=\"70\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <rect id=\"eFrame\" width=\"86\" height=\"70\" class=\"c-frame\" />\n      <polyline id=\"eLine\" class=\"c-line\" />\n      <rect id=\"eOverlay\" width=\"86\" height=\"70\" class=\"c-overlay\" />\n    </svg>\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      label: 'mui-eblock',\n      values: null,\n      type: 0, // 0:linear env, 1: 1 step, 2:2steps, 3:3steps, 4:4steps\n\n      // internal\n      _width: 86,\n      _height: 70,\n\n      // render UI data\n      render: function () {\n        var points = '';\n        for (var i = 0; i < this.values.length; i++) {\n          points += (this.values[i][0] * this._width) + ',';\n          points += ((1.0 - this.values[i][1]) * this._height) + ' ';\n        }\n        this.$.eLine.setAttributeNS(null, 'points', points);\n      },\n\n      // update: model => knob\n      update: function () {\n        this.render();\n      },\n\n      // post: knob => model\n      post: function (dx, dy) {\n        dx = (dx || 0);\n        dy = (dy || 0);\n        this.values[1][0] += dx / this._width;\n        this.values[1][1] -= dy / this._height;\n        this.values[1][0] = WX.clamp(this.values[1][0], 0.0, 1.0);\n        this.values[1][1] = WX.clamp(this.values[1][1], 0.0, 1.0);\n        this.render();\n      },\n\n      flash: function () {\n        this.$.eOverlay.classList.switch('c-overlay', 'c-overlay-flash');\n        setTimeout(function () {\n          this.$.eOverlay.classList.switch('c-overlay-flash', 'c-overlay');\n        }.bind(this), 250)\n      },\n\n      highlight: function (bool) {\n        if (bool) {\n          this.$.eFrame.classList.switch('c-frame', 'c-frame-selected');\n        } else {\n          this.$.eFrame.classList.switch('c-frame-selected', 'c-frame');\n        }\n      },\n\n      created: function () {\n        // data values: normalized pair of (time, value)\n        this.values = [[0.0, 0.0], [0.15, 0.2], [1.0, 0.0]];\n      },\n\n      ready: function () {\n\n        // mouse responder\n        var prevData = {};\n        var mouseResponder = MUI.MouseResponder(\n          this.label,\n          this.$.eTouchable,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                document.body.style.cursor = 'move';\n                this.highlight(true);\n                prevData = data;\n                break;\n              case 'dragged':\n                switch (this.type) {\n                  case 0:\n                    var dx = data.x - prevData.x,\n                        dy = data.y - prevData.y;\n                    this.post(dx, dy);\n                    break;\n                }\n                this.post();\n                prevData = data;\n                break;\n              case 'released':\n                document.body.style.cursor = 'default';\n                this.post();\n                break;\n            }\n          }.bind(this)\n        );\n\n        // ready & go\n        this.update();\n      },\n\n      getValues: function () {\n        return this.values.slice(0);\n      }\n\n    });\n  </script>\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-group/mui-group.html",
    "content": "<!--\n  `mui-group`\n  @version 1.0.0-alpha2\n  @description MUI group element. A container for multiple elements.\n-->\n\n<polymer-element name=\"mui-group\" attributes=\"label\">\n<template>\n  <style>\n    :host {\n      display: inline-block;\n    }\n    .mui-group-container {\n      position: relative;\n      display: inline-block;\n      margin: 0 6px 10px 0;\n      padding: 0;\n      vertical-align: top;\n    }\n    .mui-group-header {\n      font-family: 'Roboto Condensed', sans-serif;\n      color: #90a4ae;\n      font-size: 0.7rem;\n      line-height: 0.8rem;\n      padding-bottom: 2px;\n      text-align: center;\n      border-bottom: 1px solid #cfd8dc;\n      /* text-transform: uppercase; */\n    }\n  </style>\n  <div class=\"mui-group-container\">\n    <div class=\"mui-group-header\">\n      <span class=\"label\">{{ label }}</span>\n    </div>\n    <div class=\"mui-group-content\">\n      <content></content>\n    </div>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    label: 'Unlabeled'\n\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-knob/mui-knob.html",
    "content": "<!--\n  `mui-knob`\n  @version 1.0.0-alpha2\n  @description MUI knob abstraction.\n-->\n\n<polymer-element name=\"mui-knob\" attributes=\"value min max label\">\n  <template>\n    <style>\n    @-webkit-keyframes flash {\n      from { opacity: 0.5; }\n      to { opacity: 0; }\n    }\n    :host {\n      display: inline-block;\n      vertical-align: middle;\n      margin: 6px 2px;\n      width: 48px;\n      height: 80px;\n      -webkit-user-select: none;\n    }\n    input:focus {\n      outline: none;\n    }\n    .c-knob-label {\n      display: block;\n      color: #607d8b;\n      font-family:'Roboto Condensed', sans-serif;\n      font-size: 0.7rem;\n      height: 16px;\n      line-height: 16px;\n      text-align: center;\n    }\n    .c-knob-flat {\n      display: block;\n      cursor: move;\n    }\n    .c-knob-value {\n      display: block;\n      font-family:'Roboto', sans-serif;\n      font-size: 0.725rem;\n      height: 16px;\n      width: 48px;\n      line-height: 16px;\n      text-align: center;\n      color: #37474f;\n      background-color: #cfd8dc;\n      border-radius: 3px;\n      margin-top: 3px;\n      padding: 0;\n      border: none;\n    }\n    .c-knob-value-select {\n      color: #fff;\n      background-color: #546e7a;\n      box-shadow: inset 0 0 5px #263238;\n    }\n    .c-knob-flat-outer {\n      /*fill: #353D42;*/\n      /*fill: #7E8AA2;*/\n      /*fill: #374140;*/\n      /*fill: #31353D;*/\n      stroke: #cfd8dc;\n      stroke-width: 0.75px;\n      fill: none;\n    }\n    .c-knob-flat-inner {\n      /*fill: #505455;*/\n      /*fill: #EEE;*/\n      /*fill: #D9CB9E;*/\n      /*fill: #445878;*/\n      fill: #b0bec5;\n    }\n    .c-overlay {\n      fill: #e91e63;\n      opacity: 0;\n    }\n    .c-overlay-flash {\n      fill: #e91e63;\n      -webkit-animation-name: flash;\n      -webkit-animation-duration: 0.15s;\n      /*fill: #EEE;*/\n      /*fill: #D9CB9E;*/\n      /*fill: #445878;*/\n      /*fill: #b0bec5;*/\n    }\n    .c-knob-flat-gauge {\n      /*stroke: #0CB4F5;*/\n      /*stroke: #FF9800;*/\n      /*stroke: #DC3522;*/\n      stroke: #039be5;\n      stroke-width: 4px;\n      fill: none;\n    }\n    </style>\n    <div class=\"c-knob-label\">{{label}}</div>\n    <svg id=\"eTouchable\" class=\"c-knob-flat\" width=\"48\" height=\"48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"23\" class=\"c-knob-flat-outer\" />\n      <path id=\"eKnob\" class=\"c-knob-flat-gauge\" />\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"16\" class=\"c-knob-flat-inner\" />\n      <rect id=\"eOverlay\" x=\"0\" y=\"0\" width=\"48\" height=\"48\" rx=\"4\" ry=\"4\" class=\"c-overlay\" />\n    </svg>\n    <input id=\"eValueDisplay\" type=\"text\" class=\"c-knob-value\">\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      // published\n      label: 'unlabeled',\n      value: 0.0,\n      min: 0.0,\n      max: 1.0,\n\n      // binding\n      targetParam: null,\n      cloudMap: null,\n      cloudParam: null,\n\n      // private\n      _normValue: 0.0,\n      _offset: Math.PI * 0.75,\n      _arcPath: null,\n      _arcCenter: 23.5,\n      _arcRadius: 19,\n\n      // counter\n      _counter: 0,\n\n      // render UI data\n      render: function () {\n        var target = this._normValue * Math.PI * 1.5 ;\n        this._arcPath.x = this._arcCenter + this._arcRadius * Math.cos(this._offset + target);\n        this._arcPath.y = this._arcCenter + this._arcRadius * Math.sin(this._offset + target);\n        this._arcPath.largeArcFlag = (target < Math.PI) ? false : true;\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n      },\n\n      flash: function () {\n        this.$.eOverlay.classList.switch(\n          'c-overlay',\n          'c-overlay-flash'\n        );\n        console.log(this.$.eOverlay.classList);\n        setTimeout(function () {\n          this.$.eOverlay.classList.switch(\n            'c-overlay-flash',\n            'c-overlay'\n          );\n        }.bind(this), 150);\n      },\n\n      // update: model => knob\n      update: function () {\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n        this.render();\n      },\n\n      // post: knob => model\n      post: function () {\n        // update target param\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method instead\n          this.targetParam.set(this.value, WX.now + 0.05, 1);\n        }\n        if (this.cloudMap) {\n          this.cloudMap._callbackMUI(this.cloudParam, this.value);\n        }\n        this.render();\n      },\n\n      attributeChanged: function (attrName, oldVal, newVal) {\n        this.update();\n      },\n\n      // created = entry point\n      ready: function () {\n\n        // initialize\n        this.value = parseFloat(this.value);\n        this.min = parseFloat(this.min);\n        this.max = parseFloat(this.max);\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n\n        // create arc path\n        var target = this._normValue * Math.PI * 1.5;\n        var x1 = this._arcCenter + this._arcRadius * Math.cos(this._offset);\n        var y1 = this._arcCenter + this._arcRadius * Math.sin(this._offset);\n        var x2 = this._arcCenter + this._arcRadius * Math.cos(target + this._offset);\n        var y2 = this._arcCenter + this._arcRadius * Math.sin(target + this._offset);\n        var flag = (target < Math.PI) ? 0 : 1;\n        var d = 'M ' + x1 + ' ' + y1 + ' A ' + this._arcRadius + ' ' + this._arcRadius;\n        d += ' 0 ' + flag + ' 1 ' + x2 + ' ' + y2 + ' ';\n        this.$.eKnob.setAttribute('d', d);\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n        this._arcPath = this.$.eKnob.pathSegList.getItem(1);\n\n        // mouse responder\n        var prevData = {};\n        var mouseResponder = MUI.MouseResponder(\n          this.label,\n          this.$.eTouchable,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                prevData = data;\n                document.body.style.cursor = 'move';\n                break;\n              case 'dragged':\n                var delta = ((data.x - prevData.x) || -(data.y - prevData.y)) * ((data.shiftKey) ? 0.001 : 0.01);\n                prevData = data;\n                // norm => val => post\n                this._normValue += delta;\n                this._normValue = Math.min(Math.max(this._normValue, 0.0), 1.0);\n                this.value = this._normValue * (this.max - this.min) + this.min;\n                this.post();\n                break;\n              case 'released':\n                document.body.style.cursor = 'default';\n                this.post();\n                break;\n            }\n          }.bind(this)\n        );\n\n        // keyboard input responder\n        var display = this.$.eValueDisplay;\n        var keyResponder = MUI.KeyResponder(\n          this.label,\n          display,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                display.className += ' c-knob-value-select';\n                display.select();\n                break;\n              case 'keypressed':\n                if (data === 13) {\n                  var v = parseFloat(display.value);\n                  // sanity check\n                  if (!isNaN(v)) {\n                    // val => norm => post\n                    this.value = Math.min(Math.max(v, this.min), this.max);\n                    this._normValue = (this.value - this.min) / (this.max - this.min);\n                    this.post();\n                  }\n                  display.blur();\n                }\n                break;\n              case 'finished':\n                display.className = 'c-knob-value';\n                break;\n            }\n          }.bind(this)\n        );\n\n        // ready & go\n        this.update();\n      },\n\n      loadTargetParamData: function () {\n        if (this.targetParam) {\n          this.label = this.targetParam.name;\n          this.min = this.targetParam.min;\n          this.max = this.targetParam.max;\n          this.value = this.targetParam.value;\n          this.update();\n        }\n      },\n\n      // link to plugin, param and cloudMap\n      link: function (plugin, param, cloudMap) {\n        // get target parameter object\n        this.targetParam = plugin.params[param];\n        // load plugin param data\n        this.loadTargetParamData();\n        // setup path observer to plugin param\n        var obsPlugin = new PathObserver(plugin.params[param], 'value');\n        obsPlugin.open(function (newValue, oldValue) {\n          if (this.value === newValue) return;\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n\n        // OPTIONAL: add param to cloud map data\n        if (cloudMap) {\n          this.cloudMap = cloudMap;\n          this.cloudParam = param;\n          // this.cloudMap.registerParam(param, this.value);\n          // setup path observer to cloud map param\n          var obsCloudMap = new PathObserver(cloudMap.localCache, param);\n          obsCloudMap.open(function (newValue, oldValue) {\n            if (this.value === newValue) return;\n            this.value = newValue;\n            this.update();\n            this.flash();\n            // TEMP: need to update target parameter in plugin too.\n            if (this.targetParam) {\n              this.targetParam.set(this.value, WX.now + 0.05, 1);\n            }\n          }.bind(this));\n        }\n\n      }\n\n    });\n  </script>\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-knobh/mui-knobh.html",
    "content": "<!--\n  `mui-knobh`\n  @version 1.0.0-alpha2\n  @description MUI knob abstraction with horizontal layout.\n-->\n\n<polymer-element name=\"mui-knobh\" attributes=\"value min max label\">\n  <template>\n    <style>\n      :host {\n        display: inline-block;\n        vertical-align: middle;\n        margin: 6px 2px;\n        width: 100px;\n        height: 48px;\n        -webkit-user-select: none;\n      }\n      input:focus {\n        outline: none;\n      }\n      .c-knob-label {\n        display: block;\n        color: #607d8b;\n        font-family:'Roboto Condensed', sans-serif;\n        font-size: 0.7rem;\n        height: 16px;\n        line-height: 16px;\n        text-align: center;\n      }\n      .c-knob-flat {\n        display: block;\n        cursor: move;\n      }\n      .c-knob-value {\n        display: block;\n        font-family:'Roboto', sans-serif;\n        font-size: 0.725rem;\n        height: 16px;\n        width: 48px;\n        line-height: 16px;\n        text-align: center;\n        color: #37474f;\n        background-color: #cfd8dc;\n        border-radius: 3px;\n        margin-top: 3px;\n        padding: 0;\n        border: none;\n      }\n      .c-knob-value-select {\n        color: #fff;\n        background-color: #546e7a;\n        box-shadow: inset 0 0 5px #263238;\n      }\n      .c-right {\n        display: block;\n        float: right;\n        margin-top: 4px;\n      }\n      .c-knob-flat-outer {\n        /*fill: #353D42;*/\n        /*fill: #7E8AA2;*/\n        /*fill: #374140;*/\n        stroke: #cfd8dc;\n        stroke-width: 0.75px;\n        fill: none;\n      }\n      .c-knob-flat-inner {\n        /*fill: #505455;*/\n        /*fill: #EEE;*/\n        /*fill: #D9CB9E;*/\n        fill: #b0bec5;\n      }\n      .c-knob-flat-gauge {\n        /*stroke: #0CB4F5;*/\n        /*stroke: #FF9800;*/\n        /*stroke: #DC3522;*/\n        stroke: #039be5;\n        stroke-width: 4px;\n        fill: none;\n      }\n    </style>\n\n    <div class=\"c-right\">\n      <div class=\"c-knob-label\">{{label}}</div>\n      <input id=\"eValueDisplay\" type=\"text\" class=\"c-knob-value\">\n    </div>\n    <svg id=\"eTouchable\" class=\"c-knob-flat\" width=\"48\" height=\"48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"23\" class=\"c-knob-flat-outer\" />\n      <path id=\"eKnob\" class=\"c-knob-flat-gauge\" />\n      <circle cx=\"23.5\" cy=\"23.5\" r=\"16\" class=\"c-knob-flat-inner\" />\n    </svg>\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      // published\n      label: 'unlabeled',\n      value: 0.0,\n      min: 0.0,\n      max: 1.0,\n\n      // binding\n      targetParam: null,\n      cloudMap: null,\n      cloudParam: null,\n\n      // private\n      _normValue: 0.0,\n      _offset: Math.PI * 0.75,\n      _arcPath: null,\n      _arcCenter: 23.5,\n      _arcRadius: 19,\n\n      // counter\n      _counter: 0,\n\n      // render UI data\n      render: function () {\n        var target = this._normValue * Math.PI * 1.5 ;\n        this._arcPath.x = this._arcCenter + this._arcRadius * Math.cos(this._offset + target);\n        this._arcPath.y = this._arcCenter + this._arcRadius * Math.sin(this._offset + target);\n        this._arcPath.largeArcFlag = (target < Math.PI) ? false : true;\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n      },\n\n      // update: model => knob\n      update: function () {\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n        this.render();\n      },\n\n      // post: knob => model\n      post: function () {\n        // update target param\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method instead\n          this.targetParam.set(this.value, WX.now + 0.05, 1);\n        }\n        if (this.cloudMap) {\n          this.cloudMap.set(this.cloudParam, this.value);\n        }\n        this.render();\n      },\n\n      attributeChanged: function (attrName, oldVal, newVal) {\n        this.update();\n      },\n\n      // created = entry point\n      ready: function () {\n\n        // initialize\n        this.value = parseFloat(this.value);\n        this.min = parseFloat(this.min);\n        this.max = parseFloat(this.max);\n        this.value = Math.max(Math.min(this.value, this.max), this.min);\n        this._normValue = (this.value - this.min) / (this.max - this.min);\n\n        // create arc path\n        var target = this._normValue * Math.PI * 1.5;\n        var x1 = this._arcCenter + this._arcRadius * Math.cos(this._offset);\n        var y1 = this._arcCenter + this._arcRadius * Math.sin(this._offset);\n        var x2 = this._arcCenter + this._arcRadius * Math.cos(target + this._offset);\n        var y2 = this._arcCenter + this._arcRadius * Math.sin(target + this._offset);\n        var flag = (target < Math.PI) ? 0 : 1;\n        var d = 'M ' + x1 + ' ' + y1 + ' A ' + this._arcRadius + ' ' + this._arcRadius;\n        d += ' 0 ' + flag + ' 1 ' + x2 + ' ' + y2 + ' ';\n        this.$.eKnob.setAttribute('d', d);\n        this.$.eValueDisplay.value = this.value.toFixed(2);\n        this._arcPath = this.$.eKnob.pathSegList.getItem(1);\n\n        // mouse responder\n        var prevData = {};\n        var mouseResponder = MUI.MouseResponder(\n          this.label,\n          this.$.eTouchable,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                prevData = data;\n                document.body.style.cursor = 'move';\n                break;\n              case 'dragged':\n                var delta = ((data.x - prevData.x) || -(data.y - prevData.y)) * ((data.shiftKey) ? 0.001 : 0.01);\n                prevData = data;\n                // norm => val => post\n                this._normValue += delta;\n                this._normValue = Math.min(Math.max(this._normValue, 0.0), 1.0);\n                this.value = this._normValue * (this.max - this.min) + this.min;\n                this.post();\n                break;\n              case 'released':\n                document.body.style.cursor = 'default';\n                this.post();\n                break;\n            }\n          }.bind(this)\n        );\n\n        // keyboard input responder\n        var d = this.$.eValueDisplay;\n        var keyResponder = MUI.KeyResponder(\n          this.label,\n          d,\n          function (sender, action, data) {\n            switch (action) {\n              case 'clicked':\n                d.className += ' c-knob-value-select';\n                d.select();\n                break;\n              case 'keypressed':\n                if (data === 13) {\n                  var v = parseFloat(d.value);\n                  // sanity check\n                  if (!isNaN(v)) {\n                    // val => norm => post\n                    this.value = Math.min(Math.max(v, this.min), this.max);\n                    this._normValue = (this.value - this.min) / (this.max - this.min);\n                    this.post();\n                  }\n                  d.blur();\n                }\n                break;\n              case 'finished':\n                d.className = 'c-knob-value';\n                break;\n            }\n          }.bind(this)\n        );\n\n        // ready & go\n        this.update();\n      },\n\n      loadTargetParamData: function () {\n        if (this.targetParam) {\n          this.label = this.targetParam.name;\n          this.min = this.targetParam.min;\n          this.max = this.targetParam.max;\n          this.value = this.targetParam.value;\n          this.update();\n        }\n      },\n\n      // link to plugin, param and cloudMap\n      link: function (plugin, param, cloudMap) {\n\n        // get target parameter object\n        this.targetParam = plugin.params[param];\n        // load plugin param data\n        this.loadTargetParamData();\n        // setup path observer to plugin param\n        var obsPlugin = new PathObserver(plugin.params[param], 'value');\n        obsPlugin.open(function (newValue, oldValue) {\n          if (this.value === newValue) return;\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n\n        // OPTIONAL: add param to cloud map data\n        if (cloudMap) {\n          this.cloudMap = cloudMap;\n          this.cloudParam = param;\n          // this.cloudMap.registerParam(param, this.value);\n          // setup path observer to cloud map param\n          var obsCloudMap = new PathObserver(cloudMap.localCache, param);\n          obsCloudMap.open(function (newValue, oldValue) {\n            if (this.value === newValue) return;\n            this.value = newValue;\n            this.update();\n            // TEMP: need to update target parameter in plugin too.\n            if (this.targetParam) {\n              this.targetParam.set(this.value, WX.now + 0.05, 1);\n            }\n          }.bind(this));\n        }\n\n      }\n\n    });\n  </script>\n</polymer-element>\n"
  },
  {
    "path": "src/mui/mui-meter/mui-meter.html",
    "content": "<!--\n  `mui-meter`\n  @version 1.0.0-alpha3\n  @description MUI level meter abstraction. Can be considered as AudioNode, to\n    visualize output of AnalyserNode.\n-->\n\n<polymer-element name=\"mui-meter\">\n<template>\n  <style>\n    :host {\n      width: 64px;\n      display: block;\n      overflow: hidden;\n      margin-bottom: 5px;\n    }\n    .mui-meter-container {\n      /*width: 100%;*/\n      position: relative;\n      display: block;\n      vertical-align: top;\n      overflow: hidden;\n    }\n    .mui-meter-toolbar {\n      display: block;\n      height: 28px;\n      background-color: #eee;\n    }\n  </style>\n  <div id=\"eContainer\" class=\"mui-meter-container\">\n    <canvas id=\"eOnScreenCanvas\"></canvas>\n    <div id=\"eValue\"></div>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    _ctx: null,\n    _inlet: null,\n    _buffer: null,\n    _currentLevel: -100,\n    _maxLevelSoFar: -100,\n\n    _levelEstimate: 0.0,\n    _b0_a: 1.0 - Math.exp(-1 / (0.003 * WX.srate)),\n    _b0_r: 1.0 - Math.exp(-1 / (0.006 * WX.srate)),\n\n    _settings: {\n      maxdB: 0.0,\n      mindB: -60.0,\n      grid: true,\n      gridColor: '#333',\n      meterColor: '#03a9f4'\n    },\n\n    _initializeAnalyzer: function () {\n      this._inlet = WX.Analyzer();\n      var bc = this._inlet.frequencyBinCount;\n      this._buffer = new Float32Array(bc);\n      this._settings.nyquist = WX.srate * 0.5;\n      this._settings.binCount = bc;\n      this._settings.binSize = WX.srate / bc;\n      this._settings.logMax = Math.log((bc - 1) / 1.0, 2.0);\n      this._settings.baseX = 0.0;\n      this._settings.unitX = 0.0;\n      this._settings.scaleY = 0.0;\n    },\n\n    _estimateLevel: function (x) {\n      // rms level\n      x = x * x;\n      var delta = x - this._levelEstimate;\n      if (delta > 0) {\n        this._levelEstimate += this._b0_a * delta;\n      } else {\n        this._levelEstimate += this._b0_r * delta;\n      }\n    },\n\n    _resize: function () {\n      this._ctx.canvas.style.width = '100%';\n      this._ctx.canvas.width = this.clientWidth;\n      this._ctx.canvas.height = this.clientHeight;\n      this._settings.baseX = this._ctx.canvas.width / 4.0;\n      this._settings.unitX = this._ctx.canvas.width / this._buffer.length;\n      this._settings.scaleY = this._ctx.canvas.height;\n    },\n\n    _clearCanvas: function () {\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this.clientWidth, this.clientHeight);\n    },\n\n    _drawForeground: function () {\n      var c = this._ctx,\n          s = this._settings,\n          dBGridUnit = 12.0,\n          numUnits = ~~(100 / dBGridUnit);\n      c.lineWidth = 0.4;\n      c.strokeStyle = this._settings.gridColor;\n      c.fillStyle = this._settings.gridColor;\n      c.beginPath();\n      // db grid\n      for (var grid = 0; grid < numUnits; grid++) {\n        var y = grid * c.canvas.height / numUnits;\n        var d = 0.0 + (dBGridUnit * grid);\n        c.moveTo(0.0, y);\n        c.lineTo(c.canvas.width, y);\n        c.fillText(~~(d) + \"dB\", c.canvas.width - 26, y - 3);\n      }\n      c.stroke();\n    },\n\n    _drawBackground: function () {\n    },\n\n    _drawMeter: function () {\n      var c = this._ctx,\n          s = this._settings;\n      // clear and draw grids\n      c.clearRect(0, 0, c.canvas.width, c.canvas.height);\n\n      // if (s.grid) {\n      //   this._drawBackground();\n      // }\n      // // drawing spectrum\n      // c.lineWidth = 1.2;\n      // c.strokeStyle = s.spectrumColor;\n      // c.beginPath();\n      // this._inlet.getFloatFrequencyData(this._buffer);\n      // for(var i = 1; i < s.binCount; i++) {\n      //   if (s.scale === 'lin') {\n      //     c.moveTo(i * s.unitX, s.scaleY);\n      //     c.lineTo(i * s.unitX, (this._buffer[i] * -0.01) * s.scaleY);\n      //   } else {\n      //     var x = c.canvas.width * Math.log(i / 1, s.logBase) / s.logMax;\n      //     c.lineTo(x, (this._buffer[i] * -0.01) * s.scaleY);\n      //   }\n      // }\n      // c.stroke();\n      this._inlet.getFloatTimeDomainData(this._buffer);\n      // for(var i = 1; i < s.binCount; i++) {\n        // if (s.scale === 'lin') {\n        //   c.moveTo(i * s.unitX, s.scaleY);\n        //   c.lineTo(i * s.unitX, (this._buffer[i] * -0.01) * s.scaleY);\n        // } else {\n        //   var x = c.canvas.width * Math.log(i / 1, s.logBase) / s.logMax;\n        //   c.lineTo(x, (this._buffer[i] * -0.01) * s.scaleY);\n        // }\n      // }\n      for (var i = 0; i < this._buffer.length; i+=4) {\n        this._estimateLevel(this._buffer[i]);\n      }\n      var detected = WX.lintodb(Math.sqrt(this._levelEstimate));\n      var height = (100 + detected) / 100 * c.canvas.height;\n      c.fillStyle = this._settings.meterColor;\n      c.fillRect(0, c.canvas.height - height, c.canvas.width, height);\n\n      if (detected > this._maxLevelSoFar) {\n        this.$.eValue.textContent = detected.toString();\n        this._maxLevelSoFar = detected;\n      }\n    },\n\n    _draw: function () {\n      // this._clearCanvas();\n      // this._drawBackground();\n      this._drawMeter();\n      this._drawForeground();\n    },\n\n    update: function () {\n      if (!this._freeze) {\n        this._draw();\n      }\n      requestAnimationFrame(this.update.bind(this));\n    },\n\n    ready: function () {\n\n      // create 2d context\n      this._ctx = this.$.eOnScreenCanvas.getContext('2d');\n\n      // initialization\n      this._initializeAnalyzer();\n      this._resize();\n\n      // UI specific vars\n      var prevData, uy;\n\n      // mouse responder\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this.$.eOnScreenCanvas,\n        function (sender, action, data) {\n          // TODO: needs to be refactored!\n          switch (action) {\n            case 'clicked':\n              break;\n            case 'dragged':\n              break;\n            case 'released':\n              break;\n          }\n          prevData = data;\n        }.bind(this)\n      );\n\n      // start\n      this.update();\n    }\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-pianoroll/mui-pianoroll.html",
    "content": "<polymer-element name=\"mui-pianoroll\">\n\n<template>\n\n  <style>\n    :host {\n      /*width: 100%;*/\n      display: block;\n      overflow: hidden;\n      margin-bottom: 5px;\n      height: 300px;\n    }\n    .mui-pianoroll-container {\n      /*width: 100%;*/\n      position: relative;\n      display: block;\n      vertical-align: top;\n      overflow: hidden;\n    }\n    .mui-pianoroll-toolbar {\n      display: block;\n      height: 28px;\n      background-color: #eee;\n    }\n  </style>\n\n  <div id=\"eContainer\" class=\"mui-pianoroll-container\">\n    <div id=\"eToolbar\" class=\"mui-pianoroll-toolbar\"></div>\n    <canvas id=\"eOnScreenCanvas\"></canvas>\n  </div>\n\n</template>\n\n<script>\n  Polymer('mui-pianoroll', {\n\n    // primary and offscreen context\n    _ctx: null,\n    _ctxos: null,\n\n    _noteclip: null,\n    _selectedNotesId: [],\n    _newNote: null,\n    _newNoteId: null,\n\n    // key responder: internal key data strcuture\n    _keys: [],\n\n    // current viewpoint's virtual coord\n    _cx: 0,\n    _cy: 0,\n\n    // area\n    _minH: 400,\n    _vp: { x: 0, y: 0, w: null, h: null },\n    _ruler: { x: 40, y: 0, w: null, h: 23 },\n    _kbd: { x: 0, y: 23, w: 40, h: null },\n    _grid: { x: 40, y: 23, w: null, h: null },\n\n    // pitchRange (keyboard): C-1 (0) ~ G9 (127)\n    // kbd unit texture height * numOctave + offset\n    _kbdMaxH: 96 * 10 + 64,\n\n    // tiles\n    _tile: {\n      ruler: { x: 40, y: 0, w: 320, h: 23 },\n      kbd: { x: 0, y: 23, w: 40, h: 96},\n      grid: { x: 40, y: 23, w: 320, h: 96 }\n      // lane: { x: 40, y: 119, w: 320, h: 74 }\n    },\n\n    // tick per pixel, pitch per pixel (tick_per_beat = 480)\n    _tickPx: (480 * 4) / 320,\n    _pitchPx: 12 / 96,\n    _pxTick: 320 / (480 * 4),\n    _pxPitch: 96 / 12,\n\n    // dirty flag\n    _needsRedraw: true,\n\n    // action handler variables, marquee area\n    _actionMode: 'IDLE',\n    _marqueeStart: { x: 0, y: 0 },\n    _marqueeEnd: { w: 0, h: 0 },\n\n    // cloud realtime model ref\n    _cloudModel: null,\n\n    // transport object reference\n    _transport: null,\n\n    //\n    // utilities\n    //\n\n    _MIDI2Grid: function (note) {\n      return {\n        x: Math.ceil(note.start * this._pxTick) - this._cx + this._kbd.w,\n        y: Math.floor((130 - note.pitch) * this._pxPitch) - this._cy,\n        w: Math.floor(note.duration * this._pxTick),\n        h: this._pxPitch\n      };\n    },\n\n    _grid2MIDI: function (data) {\n      var nx = this._cx + data.x - this._kbd.w,\n          ny = this._cy + data.y - this._ruler.h;\n      return {\n        pitch: 127 - Math.floor(ny * this._pitchPx),\n        tick: Math.round(nx * this._tickPx)\n      };\n    },\n\n    _grid2MIDIDelta: function (dx, dy) {\n      return {\n        pitch: dy * this._pitchPx,\n        tick: Math.round(dx * this._tickPx)\n      };\n    },\n\n    // this will return action mode\n    _selectNoteAtPos: function (posMIDI) {\n      if (this._noteclip) {\n        // get note id\n        var id = this._noteclip.findNoteIdAtPosition(posMIDI.pitch, posMIDI.tick);\n        // add note id to the selection\n        if (id) {\n          if (this._selectedNotesId.indexOf(id) < 0) {\n            this._selectedNotesId.push(id);\n          }\n          // check if position query was at the end of note (-45 ticks)\n          var note = this._noteclip.get(id);\n          var end = note.getEnd();\n          if (end - 45 <= posMIDI.tick && posMIDI.tick <= end) {\n            return 'RESIZE';\n          }\n          return 'MOVE';\n        }\n      }\n      return null;\n    },\n\n    _selectNotesInMarquee: function () {\n      // get note id bucket\n      var start = this._grid2MIDI(this._marqueeStart),\n          end = this._grid2MIDI(this._marqueeEnd);\n      var minPitch, maxPitch, startTick, endTick;\n      // TODO: arrange min, max accordingly\n      if (start.pitch <= end.pitch) {\n        minPitch = start.pitch;\n        maxPitch = end.pitch;\n      } else {\n        minPitch = end.pitch;\n        maxPitch = start.pitch;\n      }\n      if (start.tick <= end.tick) {\n        startTick = start.tick;\n        endTick = end.tick;\n      } else {\n        startTick = end.tick;\n        endTick = start.tick;\n      }\n      if (this._noteclip) {\n        var notesId = this._noteclip.findNotesIdInArea(\n          minPitch, maxPitch, startTick, endTick\n        );\n        if (notesId) {\n          for (var i = 0; i < notesId.length; i++) {\n            if (this._selectedNotesId.indexOf(notesId[i]) < 0) {\n              this._selectedNotesId.push(notesId[i]);\n            }\n          }\n        }\n      }\n    },\n\n    _moveSelectedNotes: function (deltaMIDI) {\n      var changes = {};\n      for (var i = 0; i < this._selectedNotesId.length; i++) {\n        var id = this._selectedNotesId[i];\n        var note = this._noteclip.get(id);\n        note.translatePitch(deltaMIDI.pitch);\n        note.translateStart(deltaMIDI.tick);\n        changes[id] = note;\n      }\n      if (this._cloudModel) {\n        this._cloudModel._callbackMUI(changes);\n      }\n    },\n\n    _changeNoteLength: function (deltaMIDI) {\n      var changes = {};\n      for (var i = 0; i < this._selectedNotesId.length; i++) {\n        var id = this._selectedNotesId[i],\n            note = this._noteclip.get(id);\n        note.changeDuration(deltaMIDI.tick);\n        changes[id] = note;\n      }\n      if (this._cloudModel) {\n        this._cloudModel._callbackMUI(changes);\n      }\n    },\n\n    _clearNoteSelection: function () {\n      this._selectedNotesId.length = 0;\n    },\n\n    _startNewNote: function (posMIDI) {\n      var start = ~~(posMIDI.tick / 120) * 120;\n      start += (posMIDI.tick % 120) > 60 ? 120 : 0;\n      this._newNote = WX.Note(posMIDI.pitch, 100, start, 120);\n      if (this._noteclip) {\n        this._newNoteId = this._noteclip.push(this._newNote);\n      }\n    },\n\n    _updateNewNote: function (posMIDI) {\n      var duration = posMIDI.tick - this._newNote.start;\n      duration = ~~(duration / 120) * 120;\n      duration += (duration % 120) > 60 ? 120 : 0;\n      this._newNote.duration = duration;\n    },\n\n    _endNewNote: function (posMIDI) {\n      this._updateNewNote(posMIDI);\n      var changes = {};\n      if (this._cloudModel) {\n        changes[this._newNoteId] = this._newNote;\n        this._cloudModel._callbackMUI(changes);\n      }\n      this._newNote = null;\n    },\n\n    _deleteSelectedNotes: function () {\n      var changes = {};\n      for (var i = 0; i < this._selectedNotesId.length; i++) {\n        var id = this._selectedNotesId[i];\n        this._noteclip.delete(id);\n        changes[id] = null;\n      }\n      if (this._cloudModel) {\n        this._cloudModel._callbackMUI(changes);\n      }\n    },\n\n    //\n    // Drawing related\n    //\n\n    _clearCanvas: function () {\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this._kInnerWidth, this._kInnerHeight);\n    },\n\n    _resize: function () {\n      // get current host size\n      this._kInnerWidth = this.clientWidth;\n      this._kInnerHeight =\n        this.clientHeight < this._minH ? this._minH : this.clientHeight;\n      // adjust canvas size\n      this._ctx.canvas.style.width = '100%';\n      this._ctx.canvas.width = this._kInnerWidth;\n      this._ctx.canvas.height = this._kInnerHeight;\n      // adjust key coordinates\n      this._vp.w = this._kInnerWidth;\n      this._vp.h = this._kInnerHeight;\n      this._grid.w = this._kInnerWidth - this._kbd.w;\n      this._grid.h = this._kInnerHeight - this._ruler.h;\n      this._kbd.h = this._grid.h;\n      this._ruler.w = this._grid.w;\n    },\n\n    _loadImageMap: function (callback) {\n      this._imageMap = new Image();\n      this._imageMap.onload = function () {\n        callback();\n      }.bind(this);\n      this._imageMap.src = '../../build/mui/mui-pianoroll/imagemap.png';\n    },\n\n    _buildImageMap: function () {\n      // for smooth moving, pre-render possible workspace background tiles\n      // onto offscreen canvas\n\n      // get rows and cols for tiles with buffer area\n      var numCols = Math.round(this._grid.w / this._tile.grid.w) + 2,\n          numRows = Math.round(this._grid.h / this._tile.grid.h) + 2;\n      var r, c;\n\n      // resize offscreen canvas\n      this._ctxos.canvas.width =\n        this._tile.kbd.w + numCols * this._tile.grid.w;\n      this._ctxos.canvas.height =\n        this._tile.ruler.h + numRows * this._tile.grid.h;\n\n      // draw ruler\n      for (c = 0; c < numCols; c++) {\n        this._ctxos.drawImage(this._imageMap,\n          this._tile.ruler.x, this._tile.ruler.y,\n          this._tile.ruler.w, this._tile.ruler.h,\n          this._tile.ruler.x + c * this._tile.ruler.w, this._tile.ruler.y,\n          this._tile.ruler.w, this._tile.ruler.h\n        );\n        // lane: currently disabled\n        // this._ctxos.drawImage(this._imageMap,\n        //   this._tile.lane.x, this._tile.lane.y,\n        //   this._tile.lane.w, this._tile.lane.h,\n        //   this._tile.lane.x + c * this._tile.lane.w,\n        //   this._vp.h - this._tile.lane.h,\n        //   this._tile.lane.w, this._tile.lane.h\n        // );\n      };\n      // draw kbd\n      for (r = 0; r < numRows; r++) {\n        this._ctxos.drawImage(this._imageMap,\n          this._tile.kbd.x, this._tile.kbd.y,\n          this._tile.kbd.w, this._tile.kbd.h,\n          this._tile.kbd.x, this._tile.ruler.h + r * this._tile.kbd.h,\n          this._tile.kbd.w, this._tile.kbd.h\n        );\n      }\n      // draw grid\n      for (r = 0; r < numRows; r++) {\n        for (c = 0; c < numCols; c++) {\n          this._ctxos.drawImage(this._imageMap,\n            this._tile.grid.x, this._tile.grid.y,\n            this._tile.grid.w, this._tile.grid.h,\n            this._tile.kbd.w + c * this._tile.grid.w,\n            this._tile.ruler.h + r * this._tile.grid.h,\n            this._tile.grid.w, this._tile.grid.h\n          );\n        }\n      }\n    },\n\n    _drawDebug: function () {\n      this._ctx.drawImage(this._ctxos.canvas, 0, 0);\n    },\n\n    _drawForeground: function () {\n      // ruler\n      this._ctx.drawImage(this._ctxos.canvas,\n        // src\n        this._ruler.x + (this._cx % this._tile.ruler.w),\n        this._ruler.y,\n        this._ruler.w,\n        this._ruler.h,\n        // dst\n        this._ruler.x,\n        this._ruler.y,\n        this._ruler.w,\n        this._ruler.h\n      );\n      // playhead\n      if (this._vp.x <= this._playheadPos &&\n        this._playheadPos < this._vp.x + this._vp.w) {\n        this._ctx.beginPath();\n        this._ctx.moveTo(this._playheadPos, this._vp.y);\n        this._ctx.lineTo(this._playheadPos, this._vp.h);\n        this._ctx.strokeStyle = '#fff';\n        this._ctx.stroke();\n      }\n      // keyboard (32 is for G8, 127 offset)\n      this._ctx.drawImage(this._ctxos.canvas,\n        this._kbd.x,\n        this._kbd.y + 32 + (this._cy % this._tile.kbd.h),\n        this._kbd.w,\n        this._kbd.h,\n        this._kbd.x,\n        this._kbd.y,\n        this._kbd.w,\n        this._kbd.h\n      );\n      // draw marquee\n      if (this._actionMode === 'MARQUEE') {\n        this._ctx.strokeStyle = '#fff';\n        this._ctx.strokeRect(\n          this._marqueeStart.x, this._marqueeStart.y,\n          this._marqueeEnd.x - this._marqueeStart.x,\n          this._marqueeEnd.y - this._marqueeStart.y\n        );\n      }\n      // corner\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this._ruler.x, this._kbd.y);\n    },\n\n    _drawBackground: function () {\n      // grid\n      this._ctx.drawImage(this._ctxos.canvas,\n        this._grid.x + (this._cx % this._tile.grid.w),\n        this._grid.y + (this._cy % this._tile.grid.h),\n        this._grid.w,\n        this._grid.h,\n        this._grid.x,\n        this._grid.y,\n        this._grid.w,\n        this._grid.h\n      );\n    },\n\n    _drawNotes: function () {\n      this._ctx.lineWidth = 1.0;\n      if (this._noteclip) {\n        this._noteclip.iterate(function (id, note) {\n            if (note) {\n              // transfrom viewport\n              var pos = this._MIDI2Grid(note);\n              // filter out invisible notes\n              if (this._grid.x + this._grid.w < pos.x) return;\n              if (pos.x + pos.w < this._grid.x) return;\n              if (this._grid.y + this._grid.h < pos.y) return;\n              if (pos.y + pos.h < this._grid.y) return;\n              // draw note\n              if (this._selectedNotesId.indexOf(id) == -1) {\n                this._ctx.strokeStyle = '#000';\n                this._ctx.fillStyle = '#C66';\n              } else {\n                this._ctx.strokeStyle = '#fff';\n                this._ctx.fillStyle = '#D99';\n              }\n              this._ctx.strokeRect(pos.x, pos.y, pos.w, pos.h);\n              this._ctx.fillRect(pos.x, pos.y, pos.w, pos.h);\n              // console.log('drawn', note); // to debug\n            }\n          }.bind(this)\n        );\n      }\n    },\n\n    _scrollByDelta: function (dx, dy) {\n      this._cx -= dx;\n      this._cy -= dy;\n      // boundary checking\n      this._cx = (this._cx < 0) ? 0 : this._cx;\n      this._cy = (this._cy < 0) ? 0 : this._cy;\n      if (this._cy > this._kbdMaxH - this._grid.h) {\n        this._cy = this._kbdMaxH - this._grid.h;\n      }\n    },\n\n    setPlayhead: function (tick) {\n      var pos = Math.ceil(tick * this._pxTick) - this._cx + this._kbd.w;\n      if (pos !== this._playheadPos) {\n        this._playheadPos = pos;\n        this._needsRedraw = true;\n      }\n    },\n\n    reportPlayheadPos: function (tick) {\n      this._transport.setNow(tick);\n    },\n\n    _draw: function () {\n      this._clearCanvas();\n      this._drawBackground();\n      this._drawNotes();\n      this._drawForeground();\n    },\n\n    update: function () {\n      if (this._needsRedraw) {\n        this._draw();\n        this._needsRedraw = false;\n      }\n      requestAnimationFrame(this.update.bind(this));\n    },\n\n    _listenKeyDown: function (event) {\n      if (this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = true;\n      // console.log(event.keyCode);\n      switch (event.keyCode) {\n        case 46: // delete key\n          event.preventDefault();\n          this._deleteSelectedNotes();\n      }\n      this._needsRedraw = true;\n    },\n\n    _listenKeyUp: function (event) {\n      if (!this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = false;\n    },\n\n    _handleAction: function (sender, action, data) {\n\n    },\n\n    ready: function () {\n\n      // create offscreen canvas\n      var offscreen = document.createElement('canvas');\n\n      // create 2d context\n      this._ctx = this.$.eOnScreenCanvas.getContext('2d');\n      this._ctxos = offscreen.getContext('2d');\n\n      // load+build image map and callback when done\n      this._loadImageMap(function () {\n        // resize element height to minimum and clear out\n        this._resize();\n        this._buildImageMap();\n        // this._drawDebug();\n        this._needsRedraw = true;\n        this.update();\n      }.bind(this));\n\n      // UI specific vars\n      var prevData, uy;\n\n      // mouse responder\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this.$.eOnScreenCanvas,\n        function (sender, action, data) {\n          var posMIDI = this._grid2MIDI(data);\n          switch (action) {\n            case 'clicked':\n              if (MUI.isPointInArea(data, this._ruler)) {\n                // report current position to transport\n                this.reportPlayheadPos(posMIDI.tick);\n              } else if (MUI.isPointInArea(data, this._kbd)) {\n                // preview sound\n                // console.log(posMIDI.pitch);\n              } else if (MUI.isPointInArea(data, this._grid)){\n                // if a note clicked\n                if (posMIDI) {\n                  // TODO: shiftkey when selection is not empty\n                  if (!data.shiftKey) {\n                    this._clearNoteSelection();\n                  }\n                  // note end clicked = select, resize\n                  // note clicked = select, move\n                  // note not clicked = null\n                  var actionMode = this._selectNoteAtPos(posMIDI);\n                  if (actionMode) {\n                    this._actionMode = actionMode;\n                    uy = 0;\n                  } else {\n                    // altkey = create a note\n                    if (data.altKey) {\n                      document.body.style.cursor = 'crosshair';\n                      this._startNewNote(posMIDI);\n                      this._actionMode = 'CREATE';\n                    }\n                    // metakey = scroll\n                    else if (data.metaKey) {\n                      document.body.style.cursor = 'all-scroll';\n                      this._actionMode = 'SCROLL';\n                    }\n                    // otherwise, start marquee\n                    else {\n                      this._actionMode = 'MARQUEE';\n                      this._marqueeStart.x = this._marqueeEnd.x = data.x;\n                      this._marqueeStart.y = this._marqueeEnd.y = data.y;\n                    }\n                  }\n                }\n              }\n              this._needsRedraw = true;\n              break;\n            case 'dragged':\n              switch (this._actionMode) {\n                case 'MOVE':\n                  var dx = data.x - prevData.x,\n                      dy = 0;\n                  uy -= data.y - prevData.y;\n                  // quantizing ux by px per pitch\n                  if (uy > this._pxPitch || uy < -this._pxPitch) {\n                    dy = Math.round(uy / this._pxPitch);\n                    uy = uy / this._pxPitch - dy;\n                  }\n                  // translate back to screen coord\n                  dy *= this._pxPitch;\n                  // move notes\n                  this._moveSelectedNotes(this._grid2MIDIDelta(dx, dy));\n                  break;\n                case 'RESIZE':\n                  var dx = data.x - prevData.x;\n                  this._changeNoteLength(this._grid2MIDIDelta(dx, dy));\n                  break;\n                case 'CREATE':\n                  this._updateNewNote(posMIDI);\n                  break;\n                case 'SCROLL':\n                  this._scrollByDelta(data.x - prevData.x, data.y - prevData.y);\n                  break;\n                case 'MARQUEE':\n                  this._marqueeEnd.x += data.x - prevData.x;\n                  this._marqueeEnd.y += data.y - prevData.y;\n                  this._selectNotesInMarquee();\n                  break;\n              }\n              this._needsRedraw = true;\n              break;\n            case 'released':\n              document.body.style.cursor = 'default';\n              if (this._newNote) {\n                this._endNewNote(posMIDI);\n              }\n              this._actionMode = 'IDLE';\n              this._needsRedraw = true;\n              break;\n          }\n          prevData = data;\n          // console.log(this._actionMode);\n        }.bind(this)\n      );\n\n      // keyboard responder\n      window.addEventListener('keydown', this._listenKeyDown.bind(this), false);\n      window.addEventListener('keyup', this._listenKeyUp.bind(this), false);\n\n      // initial location\n      this._scrollByDelta(0, this._kbdMaxH * -0.4);\n    },\n\n    setNoteClip: function (noteclip) {\n      this._noteclip = noteclip;\n      this._needsRedraw = true;\n    },\n\n    //\n    // realtime sync features\n    //\n\n    link: function (rtModel) {\n      this._cloudModel = rtModel;\n      rtModel.view = this;\n    },\n\n    onRealtimeChange: function (id, noteArr) {\n      // console.log('realtimechange', index, noteArr);\n      if (noteArr) {\n        var note = WX.Note(noteArr[0], noteArr[1], noteArr[2], noteArr[3]);\n        this._noteclip.set(id, note);\n      } else {\n        this._noteclip.delete(id);\n      }\n      this._needsRedraw = true;\n    },\n\n    loadNote: function (id, noteArr) {\n      var note = WX.Note(noteArr[0], noteArr[1], noteArr[2], noteArr[3]);\n      this._noteclip.set(id, note);\n      this._needsRedraw = true;\n    }\n\n  });\n</script>\n\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-rack/mui-rack.html",
    "content": "<!--\n  `mui-rack`\n  @version 1.0.0-alpha2\n  @description MUI rack abstraction. A bigger and collapsible container for MUI\n    elements.\n-->\n\n<polymer-element name=\"mui-rack\" attributes=\"label opened disabled\">\n<template>\n  <style>\n    :host {\n      display: block;\n    }\n    .container {\n      padding: 8px;\n      margin: 8px 0;\n      border-radius: 2px;\n      box-shadow: 0 0 3px #898989;\n      background-color: #fff;\n      /*overflow: hidden;*/\n    }\n    .header {\n      font-family:'Roboto', sans-serif;\n      height: 24px;\n      line-height: 24px;\n      color: #b0bec5;\n      font-size: 0.9rem;\n      text-transform: uppercase;\n      /* background-color: #ddd; */\n      /* color: #31353D; */\n    }\n    .header .button {\n      float: right;\n      margin: 0;\n      padding: 0;\n      color: #03a9f4;\n      width: 24px;\n      height: 24px;\n      line-height: 24px;\n      box-shadow: none;\n    }\n    .header .button:hover {\n      box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.12);\n    }\n    .content {\n      margin-top: 4px;\n    }\n    :host(.disabled) {\n      opacity: 0.5;\n      pointer-events: none;\n    }\n  </style>\n  <div class=\"container\">\n    <div class=\"header\">\n      <mui-button id=\"eButton\" class=\"button\" icon=\"expand-more\" on-click=\"{{toggle}}\"></mui-button>\n      {{ label }}\n    </div>\n    <div class=\"content\" id=\"eContent\">\n      <content></content>\n    </div>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    label: 'RACK',\n    target: null,\n    button: null,\n    opened: true,\n    disabled: false,\n\n    update: function () {\n      if (this.opened) {\n        this.target.style.display = 'block';\n        this.button.icon = 'expand-less';\n      } else {\n        this.target.style.display = 'none';\n        this.button.icon = 'expand-more';\n      }\n    },\n\n    ready: function() {\n      this.target = this.$.eContent;\n      this.button = this.$.eButton;\n      this.update();\n    },\n\n    toggle: function() {\n      this.opened = !this.opened;\n      this.update();\n    },\n\n    disabledChanged: function() {\n      this.classList.toggle('disabled', this.disabled);\n    }\n\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-select/mui-select.html",
    "content": "<polymer-element name=\"mui-select\" attributes=\"label key value size\">\n\n  <template>\n    <style>\n      :host {\n        display: inline-block;\n        width: 160px;\n        height: 40px;\n        margin: 6px 4px;\n        vertical-align: top;\n        -webkit-user-select: none;\n      }\n      input:focus {\n        outline: none;\n      }\n      .c-select-view {\n        display: block;\n        width: 95%;\n        height: 24px;\n        line-height: 24px;\n        border-radius: 2px;\n        margin-top: 3px;\n        color: #37474f;\n        background-color: #fff;\n        box-shadow: 0 0 0 1px #cfd8dc;\n        cursor: pointer;\n      }\n      .c-select-view:active {\n        background-color: rgba(0, 0, 0, 0.05);\n        box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.2),\n          0 0 0 1px rgba(0, 0, 0, 0.24);\n      }\n      .c-select-value {\n        width: 119px;\n        height: 24px;\n        padding: 0 4px;\n        line-height: 24px;\n        font-size: 0.8rem;\n        font-family:'Roboto', sans-serif;\n        text-align: left;\n        color: #546e7a;\n      }\n      .c-select-button {\n        float: right;\n        width: 20px;\n        height: 24px;\n        text-align: center;\n        color: #78909c;\n        border-left: 1px solid #cfd8dc;\n      }\n      .c-select-label {\n        display: block;\n        width: 64px;\n        height: 16px;\n        line-height: 16px;\n        font-family:'Roboto Condensed', sans-serif;\n        color: #607d8b;\n        font-size: 11px;\n        font-weight: 400;\n        text-align: left;\n      }\n      .c-select-dropdown {\n        display: none;\n        position: absolute;\n        font-family:'Roboto', sans-serif;\n        padding: 0;\n        background-color: #fff;\n        border-radius: 0 0 3px 3px;\n        border: 1px solid #78909c;\n        vertical-align: top;\n        z-index: 1000;\n      }\n      .c-select-dropdown ul {\n        list-style: none;\n        padding: 0;\n        margin: 0;\n      }\n      li.c-select-dropdown-item {\n        height: 20px;\n        line-height: 20px;\n        font-size: 12px;\n        padding: 2px 5px;\n        text-align: left;\n        width: 124px;\n      }\n      li.c-select-dropdown-item:hover {\n        color: #fff;\n        background-color: #039be5;\n      }\n    </style>\n\n    <div class=\"c-select-label\">{{ label }}</div>\n    <div id=\"eTouchable\" class=\"c-select-view\">\n      <div class=\"c-select-button\" on-click=\"{{menuClicked}}\">&blacktriangledown;</div>\n      <div class=\"c-select-value\" on-click=\"{{menuClicked}}\">{{ key }}</div>\n      <div id=\"eDropdown\" class=\"c-select-dropdown\">\n        <ul>\n          <template id=\"eItems\" class=\"c-select-dropdown\" repeat>\n            <li class=\"c-select-dropdown-item\" on-click=\"{{itemClicked}}\" id=\"{{ value }}\">{{ key }}</li>\n          </template>\n        </ul>\n      </div>\n    </div>\n\n  </template>\n  <!-- logic -->\n  <script>\n    Polymer({\n\n      // published\n      label: 'unlabeled',\n      key: 'not ready yet',\n      value: null,\n      size: 'medium',\n\n      // private\n      _menuShown: false,\n      _modelLoaded: false,\n\n      // binding\n      targetParam: null,\n      cloudMap: null,\n      cloudParam: null,\n\n      // external event handler\n      onItemSelected: null,\n\n      render: function () {\n        this.$.eDropdown.style.display = (this._menuShown) ? 'block' : 'none';\n      },\n\n      // model => knob\n      update: function () {\n        this.key = WX.findKeyByValue(this.$.eItems.model, this.value);\n        this.render();\n      },\n\n      // post: knob => model\n      post: function () {\n        this.value = WX.findValueByKey(this.$.eItems.model, this.key);\n        // update target param\n        if (this.targetParam) {\n          // do not call the handler directly.\n          // invoke 'xxxxxParam.set' method\n          this.targetParam.set(this.value);\n        }\n        // GDrive support\n        if (this.cloudMap) {\n          this.cloudMap._callbackMUI(this.cloudParam, this.value);\n        }\n        // external event handler\n        if (this.onItemSelected) {\n          this.onItemSelected(this.value);\n        }\n        this.render();\n      },\n\n      menuClicked: function (event, detail, sender) {\n        if (this._modelLoaded) {\n          event.stopPropagation();\n          this._menuShown = !this._menuShown;\n          this.render();\n        }\n      },\n\n      itemClicked: function (event, detail, sender) {\n        event.stopPropagation();\n        this.key = sender.textContent;\n        this.value = sender.id;\n        this._menuShown = false;\n        this.post();\n        // TODO: detect outside click and close the menu\n      },\n\n      attributeChanged: function (attrName, oldVal, newVal) {\n        this.update();\n      },\n\n      ready: function () {\n        switch (this.size) {\n          case 'small':\n            this.style.width = '120px';\n            break;\n          case 'large':\n            this.style.width = '240px';\n            break;\n        }\n      },\n\n      setModel: function (collection) {\n        this.$.eItems.model = collection;\n        this.key = 'Select...';\n        this._modelLoaded = true;\n      },\n\n      setValue: function (value) {\n        var key = WX.findKeyByValue(this.$.eItems.model, value);\n        if (key) {\n          this.value = value;\n          this.key = key;\n        }\n        this.update();\n      },\n\n      loadTargetParamData: function () {\n        this.setModel(this.targetParam.getModel());\n        this.value = this.targetParam.default;\n        this.label = this.targetParam.name;\n        this.update();\n      },\n\n      link: function (plugin, param, cloudMap) {\n        // setting reference to plugin (ui => pluginparam)\n        this.targetParam = plugin.params[param];\n        // load target param data\n        this.loadTargetParamData();\n        // establish observer\n        var ob = new PathObserver(plugin.params[param], 'value');\n        ob.open(function (newValue, oldValue) {\n          if (this.value === newValue) return;\n          this.value = newValue;\n          this.update();\n        }.bind(this));\n\n        // OPTIONAL: add param to cloud map data\n        if (cloudMap) {\n          this.cloudMap = cloudMap;\n          this.cloudParam = param;\n          // this.cloudMap.registerParam(param, this.value);\n          // setup path observer to cloud map param\n          var obsCloudMap = new PathObserver(cloudMap.localCache, param);\n          obsCloudMap.open(function (newValue, oldValue) {\n            if (this.value === newValue) return;\n            this.value = newValue;\n            this.update();\n            // TEMP: need to update target parameter in plugin too.\n            if (this.targetParam) {\n              this.targetParam.set(this.value, WX.now + 0.05, 1);\n            }\n          }.bind(this));\n        }\n      }\n    });\n  </script>\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-spectrum/mui-spectrum.html",
    "content": "<!--\n  `mui-spectrum`\n  @version 1.0.0-alpha2\n  @description MUI spectrum abstraction. Can be considered as AudioNode, to\n    visualize output of AnalyserNode.\n-->\n\n<polymer-element name=\"mui-spectrum\">\n<template>\n  <style>\n    :host {\n      /*width: 100%;*/\n      display: block;\n      overflow: hidden;\n      margin-bottom: 5px;\n    }\n    .mui-spectrum-container {\n      /*width: 100%;*/\n      position: relative;\n      display: block;\n      vertical-align: top;\n      overflow: hidden;\n    }\n    .mui-spectrum-toolbar {\n      display: block;\n      height: 28px;\n      background-color: #eee;\n    }\n  </style>\n  <div id=\"eContainer\" class=\"mui-spectrum-container\">\n    <div id=\"eToolbar\" class=\"mui-spectrum-toolbar\"></div>\n    <canvas id=\"eOnScreenCanvas\"></canvas>\n  </div>\n</template>\n<script>\n  Polymer({\n\n    _ctx: null,\n    _inlet: null,\n    _buffer: null,\n    _settings: {\n      octave: 10,\n      freqBands: [30, 65, 125, 250, 500, 1000, 2000, 4000, 8000, 16000],\n      nyquist: null,\n      logBase: 2.0,\n      binCount: null,\n      binSize: null,\n      logMax: null,\n      baseX: null,\n      unitX: null,\n      scaleY: null,\n      smoothing: 0.5,\n      maxdB: 0.0,\n      mindB: -60.0,\n      scale: 'log',\n      grid: true,\n      gridColor: '#90a4ae',\n      spectrumColor: '#03a9f4',\n    },\n\n    // dirty flag\n    _freeze: false,\n\n    // key resnpoder flag\n    _keys: [],\n\n    _initializeAnalyzer: function () {\n      this._inlet = WX.Analyzer();\n      var bc = this._inlet.frequencyBinCount;\n      this._buffer = new Float32Array(bc);\n      this._settings.nyquist = WX.srate * 0.5;\n      this._settings.binCount = bc;\n      this._settings.binSize = WX.srate / bc;\n      this._settings.logMax = Math.log((bc - 1) / 1.0, 2.0);\n      this._settings.baseX = 0.0;\n      this._settings.unitX = 0.0;\n      this._settings.scaleY = 0.0;\n    },\n\n    _resize: function () {\n      this._ctx.canvas.style.width = '100%';\n      this._ctx.canvas.width = this.clientWidth;\n      this._ctx.canvas.height = this.clientHeight;\n      this._settings.baseX = this._ctx.canvas.width / 4.0;\n      this._settings.unitX = this._ctx.canvas.width / this._buffer.length;\n      this._settings.scaleY = this._ctx.canvas.height;\n    },\n\n    _clearCanvas: function () {\n      this._ctx.fillStyle = '#222';\n      this._ctx.fillRect(0, 0, this.clientWidth, this.clientHeight);\n    },\n\n    _drawForeground: function () {\n    },\n\n    _drawBackground: function () {\n      var c = this._ctx,\n          s = this._settings,\n          numGrid = s.mindB / -6.0;\n      c.lineWidth = 0.4;\n      c.strokeStyle = this._settings.gridColor;\n      c.fillStyle = this._settings.gridColor;\n      c.beginPath();\n      // freq grid\n      for (var oct = 0; oct < s.octave; oct++) {\n        var x = oct * c.canvas.width / s.octave;\n        var f = s.nyquist * Math.pow(2.0, oct - s.octave);\n        c.moveTo(x, 0.0);\n        c.lineTo(x, c.canvas.height);\n        c.fillText(~~(f) + \"Hz\", x + 4, c.canvas.height - 6);\n      }\n      // db grid\n      for (var grid = 0; grid < numGrid; grid++) {\n        var y = grid * c.canvas.height / numGrid;\n        var d = 0.0 + (6 * grid);\n        c.moveTo(0.0, y);\n        c.lineTo(c.canvas.width, y);\n        c.fillText(~~(d) + \"dB\", c.canvas.width - 26, y - 6);\n      }\n      c.stroke();\n    },\n\n    _drawSpectrum: function () {\n      var c = this._ctx,\n          s = this._settings;\n      // clear and draw grids\n      c.clearRect(0, 0, c.canvas.width, c.canvas.height);\n      if (s.grid) {\n        this._drawBackground();\n      }\n      // drawing spectrum\n      c.lineWidth = 1.2;\n      c.strokeStyle = s.spectrumColor;\n      c.beginPath();\n      this._inlet.getFloatFrequencyData(this._buffer);\n      for(var i = 1; i < s.binCount; i++) {\n        if (s.scale === 'lin') {\n          c.moveTo(i * s.unitX, s.scaleY);\n          c.lineTo(i * s.unitX, (this._buffer[i] * -0.01) * s.scaleY);\n        } else {\n          var x = c.canvas.width * Math.log(i / 1, s.logBase) / s.logMax;\n          c.lineTo(x, (this._buffer[i] * -0.01) * s.scaleY);\n        }\n      }\n      c.stroke();\n    },\n\n    _draw: function () {\n      // this._clearCanvas();\n      this._drawBackground();\n      this._drawSpectrum();\n      this._drawForeground();\n    },\n\n    update: function () {\n      if (!this._freeze) {\n        this._draw();\n      }\n      requestAnimationFrame(this.update.bind(this));\n    },\n\n    _listenKeyDown: function (event) {\n      if (this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = true;\n      // console.log(event.keyCode);\n      switch (event.keyCode) {\n        // case 46: // delete key\n        //   this._deleteSelectedNotes();\n      }\n    },\n\n    _listenKeyUp: function (event) {\n      if (!this._keys[event.keyCode]) return;\n      this._keys[event.keyCode] = false;\n    },\n\n    ready: function () {\n\n      // create 2d context\n      this._ctx = this.$.eOnScreenCanvas.getContext('2d');\n\n      // initialization\n      this._initializeAnalyzer();\n      this._resize();\n\n      // UI specific vars\n      var prevData, uy;\n\n      // mouse responder\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this.$.eOnScreenCanvas,\n        function (sender, action, data) {\n          // TODO: needs to be refactored!\n          switch (action) {\n            case 'clicked':\n              break;\n            case 'dragged':\n              break;\n            case 'released':\n              break;\n          }\n          prevData = data;\n        }.bind(this)\n      );\n\n      // keyboard responder\n      // window.addEventListener('keydown', this._listenKeyDown.bind(this), false);\n      // window.addEventListener('keyup', this._listenKeyUp.bind(this), false);\n\n      // start\n      this.update();\n    }\n  });\n</script>\n</polymer-element>"
  },
  {
    "path": "src/mui/mui-vkey/mui-vkey.html",
    "content": "<!--\n  `mui-vkey`\n  @version 1.0.0-alpha3\n  @description MUI virtual keybaord. Responds to key and mouse input.\n-->\n\n<polymer-element name=\"mui-vkey\" attributes=\"label captureKeyboard\">\n\n<template>\n\n  <style>\n    :host {\n      display: block;\n      overflow: hidden;\n    }\n    .mui-vkey-container {\n    }\n    .mui-vkey-header {\n      margin: 0 0 6px 0;\n    }\n    .mui-vkey-header .button {\n      padding: 2px 2px;\n      width: 28px;\n      height: 28px;\n      box-shadow: none;\n      box-shadow: 0 0 0 1px #cfd8dc;\n      margin: 1px;\n    }\n    /*.header .button:hover {\n      box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.1);\n    }*/\n    .c-display {\n      display: inline-block;\n      vertical-align: middle;\n      text-align: center;\n      font-family:'Roboto Condensed', sans-serif;\n      font-size: 0.7rem;\n      height: 25px;\n      line-height: 25px;\n      padding-top: 3px;\n      border-radius: 1px;\n      color: #00796b;\n      background-color: #b2dfdb;\n      box-shadow: inset 0 1px 1px 1px rgba(0, 0, 0, 0.2), 0px 0px 1px 0px rgba(0, 0, 0, 0.24);\n    }\n    .mui-vkey-octave {\n      width: 48px;\n    }\n    .mui-vkey-message {\n      float: right;\n      width: 100px;\n      margin: 1px;\n    }\n    .c-vkey {\n      display: block;\n      cursor: move;\n      background-color: #cfd8dc;\n      border-radius: 1px;\n    }\n    .c-wheel {\n      stroke: #78909c;\n      stroke-width: 1px;\n      fill: #fff;\n    }\n    .c-wheel-pos {\n      fill: #039be5;\n    }\n    .c-white-key {\n      fill: #fff;\n    }\n    .c-black-key {\n      fill: #607d8b;\n    }\n    .active {\n      fill: #039be5;\n    }\n  </style>\n\n  <div class=\"mui-vkey-container\">\n    <div class=\"mui-vkey-header\">\n      <div id=\"eMsgPanel\" class=\"c-display mui-vkey-message\">HELLO</div>\n      <mui-button class=\"mui-vkey-header button\" icon=\"hardware:keyboard\" type=\"toggle\" on-click=\"{{ toggleKeyboardInput }}\" active=\"true\"></mui-button>\n      <mui-button class=\"mui-vkey-header button\" icon=\"chevron-left\" on-click=\"{{ octaveDown }}\"></mui-button>\n      <div class=\"c-display mui-vkey-octave\">{{ _octaveStr }} oct.</div>\n      <mui-button class=\"mui-vkey-header button\" icon=\"chevron-right\" on-click=\"{{ octaveUp }}\"></mui-button>\n    </div>\n    <svg id=\"eTouchable\" class=\"c-vkey\" height=\"100\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <rect class=\"c-wheel\" x=\"6\" y=\"6\" width=\"32\" height=\"88\" rx=\"2\" ry=\"2\"></rect>\n      <rect class=\"c-wheel\" x=\"44\" y=\"6\" width=\"32\" height=\"88\" rx=\"2\" ry=\"2\"></rect>\n      <rect id=\"ePitWhlPos\" class=\"c-wheel-pos\" x=\"7\" y=\"50\" width=\"30\" height=\"2\"></rect>\n      <rect id=\"eModWhlPos\" class=\"c-wheel-pos\" x=\"45\" y=\"88\" width=\"30\" height=\"2\"></rect>\n    </svg>\n  </div>\n\n</template>\n\n<script>\n  Polymer({\n\n    // public parameter\n    label: 'mui-vkey',\n    octave: 0,\n    captureKeyboard: true,\n\n    // internal parameter\n    _octaveOffset: 24,\n    _octaveStr: '0',\n    _numKeys: 61, // 61keys, 5 octaves\n\n    // key rendering parameters\n    _svgWidth: 787,\n    _offset: 80,\n    _keyUpperY: 6,\n    _keyLowerY: 52,\n    _keyWidth: 18,\n    _keyHeight: 42,\n    _keyPaddingX: 1,\n    _keyRadius: 1.5,\n\n    // primary svg DOM object\n    _svg: null,\n    // internal key data strcuture\n    _keys: [],\n    // previous pitch (for mouse)\n    _prevPitch: null,\n\n    // keyCodeMap: zsxdcvgbhnjm q2w3er5t6y7u i\n    _keyCodes: [\n      90, 83, 88, 68, 67, 86, 71, 66, 72, 78, 74, 77,\n      81, 50, 87, 51, 69, 82, 53, 84, 54, 89, 55, 85, 73\n    ],\n\n    // target plug-ins\n    _targets: [],\n\n\n    /**\n     * Internal methods\n     */\n\n    // helper: 2d area detection\n    _checkKeyArea: function (data) {\n      if (data) {\n        for (var i = 0; i < this._keys.length; i++) {\n          var key = this._keys[i];\n          // check y first\n          if (key.y1 <= data.y && data.y <= key.y2) {\n            // then check x\n            if (key.x1 <= data.x && data.x <= key.x2) {\n              return i;\n            }\n          }\n        }\n      }\n      return null;\n    },\n\n    // helper: check p/mod wheel area\n    _checkWheelArea: function (data) {\n      if (data) {\n        // check pwheel\n        if (6 <= data.x && data.x <= 38) {\n          if (6 <= data.y && data.y <= 94) {\n            console.log('pwheel touched', (data.y - 6) / 88);\n          }\n        }\n        // check modwheel\n        if (44 <= data.x && data.x <= 76) {\n          if (6 <= data.y && data.y <= 94) {\n            console.log('modwheel touched', (data.y - 6) / 88);\n          }\n        }\n      }\n    },\n\n    // helper: key render methods\n    _renderKey: function (key) {\n      var rect = document.createElementNS(\"http://www.w3.org/2000/svg\", 'rect');\n      rect.setAttribute('x', key.x1);\n      rect.setAttribute('y', key.y1);\n      rect.setAttribute('rx', this._keyRadius);\n      rect.setAttribute('ry', this._keyRadius);\n      rect.setAttribute('width', this._keyWidth);\n      rect.setAttribute('height', this._keyHeight);\n      rect.setAttribute('class', key.white ? 'c-white-key' : 'c-black-key');\n      this._svg.appendChild(rect);\n      return rect;\n    },\n\n    // building keyboard\n    _buildKeys: function () {\n      var i = 0, count = 0;\n      while (count < this._numKeys) {\n        var pclass = i % 14;\n        i++;\n        if (pclass === 5 || pclass === 13) continue;\n        var white = (pclass % 2 === 0),\n            x1 = this._offset + i * ((this._keyWidth + this._keyPaddingX) / 2),\n            y1 = white ? this._keyLowerY : this._keyUpperY,\n            x2 = x1 + this._keyWidth,\n            y2 = y1 + this._keyHeight;\n        var key = {\n          white: white, state: false,\n          x1: x1, y1: y1, x2: x2, y2: y2\n        };\n        key.rect = this._renderKey(key);\n        this._keys[count] = key;\n        count++;\n      }\n    },\n\n    // highlight key\n    // TO FIX: this needs to be optimized (just change color, not style)\n    _highlight: function (pitch, highlight) {\n      var key = this._keys[pitch];\n      if (key) {\n        if (highlight) {\n          key.rect.setAttribute('class', key.rect.getAttribute('class') + ' active');\n        } else {\n          key.rect.setAttribute('class', key.rect.getAttribute('class').slice(0, 11));\n        }\n      }\n      // if (pitch !== null) {\n      //   var key = this._keys[pitch];\n      //   if (key) {\n      //     key.rect.setAttribute('class', key.rect.getAttribute('class') + ' active');\n      //   }\n      // }\n      // if (this._prevPitch !== null) {\n      //   key = this._keys[this._prevPitch];\n      //   if (key) {\n      //     key.rect.setAttribute('class', key.rect.getAttribute('class').slice(0, 11));\n      //   }\n      // }\n    },\n\n    _displayMessage: function (msg) {\n      this.$.eMsgPanel.textContent = msg;\n    },\n\n    // action: { on, off, pitchwheel, modwheel }\n    // data: on[pitch, velo] off[pitch,velo] pitchwheel[value], modwheel[value]\n    _dispatch: function (sender, action, data) {\n      // dispatch 'action' and 'data' to all connected destination\n      for (var i = 0; i < this._targets.length; i++) {\n        var plugin = this._targets[i].onData(action, data);\n      }\n    },\n\n\n    /**\n     * dispatch helpers\n     */\n\n    _keyOn: function (pitch, velocity) {\n      if (pitch !== null) {\n        var xpitch = pitch + this._octaveOffset + this.octave * 12;\n        this._dispatch(this.label, 'noteon', {\n          pitch: xpitch,\n          velocity: velocity,\n          time: WX.now\n        });\n        this._displayMessage('NOTE ON ' + xpitch);\n        this._highlight(pitch, true);\n      }\n    },\n\n    _keyOff: function (pitch) {\n      var xpitch = pitch + this._octaveOffset + this.octave * 12;\n      this._dispatch(this.label, 'noteoff', {\n        pitch: xpitch,\n        velocity: 0,\n        time: WX.now\n      });\n      this._displayMessage('NOTE OFF');\n      this._highlight(pitch, false);\n    },\n\n    _setPitchWheel: function (value) {\n      this._dispatch(this.label, 'pitchwheel', { value: value });\n      this._displayMessage('PWHEEL ' + value.toFixed(2));\n      this.$.ePitWhlPos.setAttribute('y', 7 + (84 - value * 84));\n    },\n\n    _setModWheel: function (value) {\n      this._dispatch(this.label, 'modwheel', { value: value });\n      this._displayMessage('MWHEEL ' + value.toFixed(2));\n      this.$.eModWhlPos.setAttribute('y', 7 + (84 - value * 84));\n    },\n\n    /**\n     * Key Event Hanlders\n     */\n\n    _listenKeyDown: function (event) {\n      if (!this.captureKeyboard) return;\n      var pitch = this._keyCodes.indexOf(event.keyCode);\n      if (pitch > -1) {\n        if (this._keys[pitch].state) return;\n        this._keys[pitch].state = true;\n        this._keyOn(pitch + this._octaveOffset + this.octave * 12, 100);\n      }\n    },\n\n    _listenKeyUp: function (event) {\n      if (!this.captureKeyboard) return;\n      var pitch = this._keyCodes.indexOf(event.keyCode);\n      if (pitch > -1) {\n        if (this._keys[pitch].state) {\n          this._keys[pitch].state = false;\n          this._keyOff(pitch + this._octaveOffset + this.octave * 12);\n        }\n      }\n    },\n\n    // return action, data1, data2\n    // TO FIX: redesign interaction...\n    _mouseCallback: function (sender, action, data) {\n      if (data) {\n        if (6 <= data.y && data.y <= 94) {\n          switch (action) {\n            case 'clicked':\n              if (6 <= data.x && data.x <= 38) { // check pwheel\n                this._setPitchWheel(1.0 - (data.y - 6) / 88);\n              } else if (44 <= data.x && data.x <= 76) { // check modwheel\n                this._setModWheel(1.0 - (data.y - 6) / 88);\n              } else if (this._offset <= data.x && data.x <= this._svgWidth) { // check keys\n                for (var i = 0; i < this._keys.length; i++) {\n                  var key = this._keys[i];\n                  // check y first\n                  if (key.y1 <= data.y && data.y <= key.y2) {\n                    // then check x\n                    if (key.x1 <= data.x && data.x <= key.x2) {\n                      this._keyOn(i, 100);\n                      this._prevPitch = i;\n                    }\n                  }\n                }\n              }\n              break;\n\n            case 'dragged':\n              if (6 <= data.x && data.x <= 38) { // check pwheel\n                this._setPitchWheel(1.0 - (data.y - 6) / 88);\n              } else if (44 <= data.x && data.x <= 76) { // check modwheel\n                this._setModWheel(1.0 - (data.y - 6) / 88);\n              } else if (this._offset <= data.x && data.x <= this._svgWidth) { // check keys\n                var validKeyFound = false;\n                for (var i = 0; i < this._keys.length; i++) {\n                  var key = this._keys[i];\n                  // check y first\n                  if (key.y1 <= data.y && data.y <= key.y2) {\n                    // then check x\n                    if (key.x1 <= data.x && data.x <= key.x2) {\n                      // check for transition and then trigger\n                      if (this._prevPitch !== i) {\n                        this._keyOff(this._prevPitch);\n                        this._keyOn(i, 100);\n                        this._prevPitch = i;\n                      }\n                      // found a key. break the loop.\n                      validKeyFound = true;\n                      break;\n                    }\n                  }\n                }\n                // pointer is at invalid area. release previous pitch.\n                if (!validKeyFound) {\n                  if (this._prevPitch) {\n                    this._keyOff(this._prevPitch);\n                    this._prevPitch = null;\n                  }\n                }\n              }\n              break;\n\n            case 'released':\n              if (this._offset <= data.x && data.x <= this._svgWidth) { // check keys\n                for (var i = 0; i < this._keys.length; i++) {\n                  var key = this._keys[i];\n                  // check y first\n                  if (key.y1 <= data.y && data.y <= key.y2) {\n                    // then check x\n                    if (key.x1 <= data.x && data.x <= key.x2) {\n                      this._keyOff(i);\n                      this._prevPitch = null;\n                    }\n                  }\n                }\n              }\n              break;\n          }\n        } else {\n          // invalid area, release previous pitch\n          if (this._prevPitch) {\n            this._keyOff(this._prevPitch);\n            this._prevPitch = null;\n          }\n        }\n      }\n    },\n\n    /**\n     * Polymer-system methods\n     */\n\n    ready: function() {\n      // set svg box size\n      this._svg = this.$.eTouchable;\n      this._svg.setAttribute('width', '100%');\n      // build keys\n      this._buildKeys();\n\n      // hook mouse event listener\n      var mouseResponder = MUI.MouseResponder(\n        this.label,\n        this._svg,\n        this._mouseCallback.bind(this)\n      );\n\n      // key listeners\n      window.addEventListener('keydown', this._listenKeyDown.bind(this), false);\n      window.addEventListener('keyup', this._listenKeyUp.bind(this), false);\n    },\n\n    /**\n     * DOM UI handlers\n     */\n\n    toggleKeyboardInput: function () {\n      this.captureKeyboard = !this.captureKeyboard;\n    },\n\n    octaveUp: function () {\n      this.octave++;\n      this._octaveStr = (this.octave > 0 ? '+' : '') + this.octave.toString();\n    },\n\n    octaveDown: function () {\n      this.octave--;\n      this._octaveStr = (this.octave > 0 ? '+' : '') + this.octave.toString();\n    },\n\n    /**\n     * Exports\n     */\n\n    addTarget: function (target) {\n      this._targets.push(target);\n    },\n\n    removeTarget: function (target) {\n      var idx = this._targets.indexOf(target);\n      if (idx > -1) {\n        this._targets.splice(idx, 1);\n      }\n    },\n\n  });\n</script>\n\n</polymer-element>"
  },
  {
    "path": "src/mui/mui.html",
    "content": "<!-- MUI fonts: Roboto and Roboto Condensed -->\n<link href='http://fonts.googleapis.com/css?family=Roboto:300,700,400'\n  rel='stylesheet' type='text/css'>\n<link href='http://fonts.googleapis.com/css?family=Roboto+Condensed:300,700,400'\n  rel='stylesheet' type='text/css'>\n\n<!-- Polymer and Core Icon -->\n<link rel=\"import\" href=\"bower_components/polymer/polymer.html\">\n<link rel=\"import\" href=\"bower_components/core-icon/core-icon.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/core-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/av-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/communication-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/hardware-icons.html\">\n<link rel=\"import\" href=\"bower_components/core-icons/social-icons.html\">\n\n<!-- MUI elements -->\n<link rel=\"import\" href=\"mui-button/mui-button.html\">\n<link rel=\"import\" href=\"mui-group/mui-group.html\">\n<link rel=\"import\" href=\"mui-knob/mui-knob.html\">\n<link rel=\"import\" href=\"mui-knobh/mui-knobh.html\">\n<link rel=\"import\" href=\"mui-meter/mui-meter.html\">\n<link rel=\"import\" href=\"mui-rack/mui-rack.html\">\n<link rel=\"import\" href=\"mui-select/mui-select.html\">\n<link rel=\"import\" href=\"mui-spectrum/mui-spectrum.html\">\n<link rel=\"import\" href=\"mui-vkey/mui-vkey.html\">\n<link rel=\"import\" href=\"mui-pianoroll/mui-pianoroll.html\">\n<link rel=\"import\" href=\"mui-eblock/mui-eblock.html\">"
  },
  {
    "path": "src/mui/mui.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\nwindow.MUI = {};\n\n/**\n * Mouse responder. 2D coordinate detection and event handler.\n * @class\n * @param {String} senderID Specified Sender ID.\n * @param {Object} targetElement Target DOM element.\n * @param {Function} MUICallback Event-handling callback.\n */\nfunction MouseResponder(senderID, targetElement, MUICallback) {\n  this.senderId = senderID;\n  this.container = targetElement;\n  this.callback = MUICallback;\n  // bound function references\n  this.ondragged = this.dragged.bind(this);\n  this.onreleased = this.released.bind(this);\n  // timestamp\n  this._prevTS = 0;\n  // init with onclick\n  this.onclicked(targetElement);\n}\n\nMouseResponder.prototype = {\n\n  getEventData: function (event) {\n    var r = this.container.getBoundingClientRect();\n    return {\n      x: event.clientX - r.left,\n      y: event.clientY - r.top,\n      ctrlKey: event.ctrlKey,\n      altKey: event.altKey,\n      shiftKey: event.shiftKey,\n      metaKey: event.metaKey\n    };\n  },\n\n  onclicked: function (target) {\n    target.addEventListener('mousedown', function (event) {\n      event.preventDefault();\n      this._prevTS = event.timeStamp;\n      var p = this.getEventData(event);\n      this.callback(this.senderId, 'clicked', p);\n      window.addEventListener('mousemove', this.ondragged, false);\n      window.addEventListener('mouseup', this.onreleased, false);\n    }.bind(this), false);\n  },\n\n  dragged: function (event) {\n    event.preventDefault();\n    if (event.timeStamp - this._prevTS < 16.7) {\n      return;\n    }\n    this._prevTS = event.timeStamp;\n    var p = this.getEventData(event);\n    this.callback(this.senderId, 'dragged', p);\n  },\n\n  released: function (event) {\n    event.preventDefault();\n    var p = this.getEventData(event);\n    this.callback(this.senderId, 'released', p);\n    window.removeEventListener('mousemove', this.ondragged, false);\n    window.removeEventListener('mouseup', this.onreleased, false);\n  }\n\n};\n\n/**\n * Keyboard responder, the keyboard event handler.\n * @class\n * @param {String} senderID Specified Sender ID.\n * @param {Object} targetElement Target DOM element.\n * @param {Function} MUICallback Event-handling callback.\n */\nfunction KeyResponder(senderID, targetElement, MUICallback) {\n  this.senderId = senderID;\n  this.container = targetElement;\n  this.callback = MUICallback;\n  // bound function references\n  this.onkeypress = this.keypressed.bind(this);\n  this.onblur = this.finished.bind(this);\n  // init with onclick\n  this.onfocus(targetElement);\n}\n\n\nKeyResponder.prototype = {\n\n  onfocus: function () {\n    this.container.addEventListener('mousedown', function (event) {\n      this.callback(this.senderId, 'clicked', null);\n      this.container.addEventListener('keypress', this.onkeypress, false);\n      this.container.addEventListener('blur', this.onblur, false);\n    }.bind(this), false);\n  },\n\n  keypressed: function (event) {\n    this.callback(this.senderId, 'keypressed', event.keyCode);\n  },\n\n  finished: function (event) {\n    this.callback(this.senderId, 'finished', null);\n    this.container.removeEventListener('keypress', this.onkeypress, false);\n    this.container.removeEventListener('blur', this.onblur, false);\n  }\n\n};\n\n\nMUI.$ = function (elementId) {\n  return document.getElementById(elementId);\n};\n\nMUI.start = function (onreadyFn) {\n  // check up depedency: platform\n  if (WX.isObject(window.Platform)) {\n    // start function when polymer is ready\n    window.addEventListener('polymer-ready', onreadyFn);\n  } else {\n    WX.Log.error('FATAL: WebComponentPolyfill/Polymer is not loaded.');\n  }\n};\n\nMUI.isPointInArea = function (point, area) {\n  return (area.x <= point.x && point.x <= area.x + area.w) &&\n    (area.y <= point.y && point.y <= area.y + area.h);\n};\n\nMUI.buildControls = function (plugin, targetId) {\n  var targetEl = document.getElementById(targetId);\n  targetEl.label = plugin.info.name;\n  for (var param in plugin.params) {\n    var p = plugin.params[param];\n    switch (p.type) {\n      case 'Generic':\n        var knob = document.createElement('mui-knob');\n        knob.link(plugin, param);\n        targetEl.appendChild(knob);\n        break;\n      case 'Itemized':\n        var select = document.createElement('mui-select');\n        select.link(plugin, param);\n        targetEl.appendChild(select);\n        break;\n      case 'Boolean':\n        var button = document.createElement('mui-button');\n        button.type = 'toggle';\n        button.link(plugin, param);\n        targetEl.appendChild(button);\n        break;\n    }\n  }\n};\n\nMUI.removeChildren = function (targetId) {\n  var targetEl = document.getElementById(targetId);\n  while (targetEl.firstChild) {\n    targetEl.removeChild(targetEl.firstChild);\n  }\n};\n\nMUI.MouseResponder = function (senderID, targetElement, MUICallback) {\n  return new MouseResponder(senderID, targetElement, MUICallback);\n};\n\nMUI.KeyResponder = function (senderID, targetElement, MUICallback) {\n  return new KeyResponder(senderID, targetElement, MUICallback);\n};"
  },
  {
    "path": "src/plug_ins/CMP1/cmp1.js",
    "content": "/**\n * @wapl CMP1\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n(function (WX) {\n\n  'use strict';\n\n  /** REQUIRED: plug-in constructor **/\n  function CMP1(preset) {\n\n    // REQUIRED: define plug-in type\n    WX.PlugIn.defineType(this, 'Processor');\n\n    // node creation and patching\n    this._comp = WX.Comp();\n    this._makeup = WX.Gain();\n    this._input.to(this._comp).to(this._makeup).to(this._output);\n\n    // define parameters\n    WX.defineParams(this, {\n\n      threshold: {\n        type: 'Generic',\n        name: 'Threshold',\n        default: -8.0,\n        min: -60.0,\n        max: 0.0,\n        unit: 'Decibels'\n      },\n\n      knee: {\n        type: 'Generic',\n        name: 'Knee',\n        default: 20,\n        min: 0,\n        max: 40,\n        unit: 'Decibels'\n      },\n\n      ratio: {\n        type: 'Generic',\n        name: 'Ratio',\n        default: 4,\n        min: 1,\n        max: 20\n      },\n\n      attack: {\n        type: 'Generic',\n        name: 'Attack',\n        default: 0.025,\n        min: 0,\n        max: 1,\n        unit: 'Seconds'\n      },\n\n      release: {\n        type: 'Generic',\n        name: 'Release',\n        default: 0.25,\n        min: 0.0,\n        max: 1.0,\n        unit: 'Seconds'\n      },\n\n      makeup: {\n        type: 'Generic',\n        name: 'Makeup',\n        default: 0.0,\n        min: 0.0,\n        max: 24.0,\n        unit: 'Decibels'\n      }\n\n    });\n\n    // REQUIRED: initializing instance with preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  /** REQUIRED: plug-in prototype **/\n  CMP1.prototype = {\n\n    // REQUIRED: plug-in info\n    info: {\n      name: 'CMP1',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Processor',\n      description: 'Basic compressor'\n    },\n\n    // REQUIRED: plug-in default preset\n    defaultPreset: {\n      threshold: -8,\n      knee: 20,\n      ratio: 4,\n      attack: 0.025,\n      release: 0.25,\n      makeup: 0,\n    },\n\n    $threshold: function (value, time, rampType) {\n      this._comp.threshold.set(value, time, rampType);\n    },\n\n    $knee: function (value, time, rampType) {\n      this._comp.knee.set(value, time, rampType);\n    },\n\n    $ratio: function (value, time, rampType) {\n      this._comp.ratio.set(value, time, rampType);\n    },\n\n    $attack: function (value, time, rampType) {\n      this._comp.attack.set(value, time, rampType);\n    },\n\n    $release: function (value, time, rampType) {\n      this._comp.release.set(value, time, rampType);\n    },\n\n    $makeup: function (value, time, rampType) {\n      this._makeup.gain.set(WX.dbtolin(value), time, rampType);\n    }\n\n  };\n\n  // REQUIRED: extending plug-in prototype with modules\n  WX.PlugIn.extendPrototype(CMP1, 'Processor');\n\n  // REQUIRED: registering plug-in into WX ecosystem\n  WX.PlugIn.register(CMP1);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/Chorus/chorus.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n(function (WX) {\n\n  'use strict';\n\n  /**\n   * Implements chorus effect by Jon Dattorro.\n   * @type {WAPL}\n   * @param {Object} preset Parameter preset.\n   * @param {Number} preset.rate Chorus rate.\n   * @param {Number} preset.depth Chorus depth.\n   * @param {Number} preset.intensity Chorus intesity.\n   * @param {Number} preset.blend Chorus blend.\n   * @param {Number} preset.mix Mix between wet and dry signal.\n   */\n  function Chorus(preset) {\n\n    WX.PlugIn.defineType(this, 'Processor');\n\n    this._dry = WX.Gain();\n    this._wet = WX.Gain();\n    var _splitter = WX.Splitter(2);\n    var _merger = WX.Merger(2);\n\n    // left stream\n    this._LStream = WX.Gain();\n    this._LDelayVibrato = WX.Delay();\n    this._LDelayFixed = WX.Delay();\n    this._LFeedback = WX.Gain();\n    this._LFeedforward = WX.Gain();\n    this._LBlend = WX.Gain();\n\n    // right stream\n    this._RStream = WX.Gain();\n    this._RDelayVibrato = WX.Delay();\n    this._RDelayFixed = WX.Delay();\n    this._RFeedback = WX.Gain();\n    this._RFeedforward = WX.Gain();\n    this._RBlend = WX.Gain();\n\n    // input\n    this._input.to(_splitter, this._dry);\n\n    // left connection\n    _splitter.connect(this._LStream, 0, 0);\n    this._LStream.to(this._LDelayVibrato);\n    this._LStream.to(this._LDelayFixed);\n    this._LDelayVibrato.to(this._LFeedforward);\n    this._LDelayVibrato.connect(_merger, 0, 0);\n    this._LDelayFixed.to(this._LFeedback);\n    this._LFeedback.to(this._LStream);\n    this._LBlend.connect(_merger, 0, 0);\n\n    // right connection\n    _splitter.connect(this._RStream, 1, 0);\n    this._RStream.to(this._RDelayVibrato);\n    this._RStream.to(this._RDelayFixed);\n    this._RDelayVibrato.to(this._RFeedforward);\n    this._RDelayVibrato.connect(_merger, 0, 1);\n    this._RDelayFixed.to(this._RFeedback);\n    this._RFeedback.to(this._RStream);\n    this._RBlend.connect(_merger, 0, 1);\n\n    // output\n    _merger.to(this._wet);\n    this._dry.to(this._output);\n    this._wet.to(this._output);\n\n    // LFO modulation\n    this._lfo = WX.OSC();\n    this._LDepth = WX.Gain();\n    this._RDepth = WX.Gain();\n    this._lfo.to(this._LDepth, this._RDepth);\n    this._LDepth.to(this._LDelayVibrato.delayTime);\n    this._RDepth.to(this._RDelayVibrato.delayTime);\n    this._lfo.start(0);\n\n    // unexposed initial settings\n    this._lfo.type = 'sine';\n    this._lfo.frequency.value = 0.15;\n\n    // dtime setting\n    this._LDepth.gain.value = 0.013;\n    this._RDepth.gain.value = -0.017;\n    this._LDelayVibrato.delayTime.value = 0.013;\n    this._LDelayFixed.delayTime.value = 0.005;\n    this._RDelayVibrato.delayTime.value = 0.017;\n    this._RDelayFixed.delayTime.value = 0.007;\n\n    // define parameters\n    WX.defineParams(this, {\n\n      rate: {\n        type: 'Generic',\n        name: 'Rate',\n        default: 0.1,\n        min: 0.1,\n        max: 1.0,\n        unit: 'Hertz'\n      },\n\n      intensity: {\n        type: 'Generic',\n        name: 'Intensity',\n        default: 0.1,\n        min: 0.01,\n        max: 1.0\n      },\n\n      mix: {\n        type: 'Generic',\n        name: 'Mix',\n        default: 0.6,\n        min: 0.0,\n        max: 1.0,\n      }\n\n    });\n\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  Chorus.prototype = {\n\n    info: {\n      name: 'Chorus',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Processor',\n      description: 'Basic chorus effect'\n    },\n\n    defaultPreset: {\n      rate: 0.5,\n      intensity: 0.0,\n      mix: 0.75\n    },\n\n    $rate: function (value, time, rampType) {\n      value = WX.clamp(value, 0.0, 1.0) * 0.29 + 0.01;\n      this._lfo.frequency.set(value, time, rampType);\n    },\n\n    $intensity: function (value, time, rampType) {\n      value = WX.clamp(value, 0.0, 1.0);\n      var blend = 1.0 - (value * 0.2929);\n      var feedforward = value * 0.2929 + 0.7071;\n      var feedback = value * 0.7071;\n      this._LBlend.gain.set(blend, time, rampType);\n      this._RBlend.gain.set(blend, time, rampType);\n      this._LFeedforward.gain.set(feedforward, time, rampType);\n      this._RFeedforward.gain.set(feedforward, time, rampType);\n      this._LFeedback.gain.set(feedback, time, rampType);\n      this._RFeedback.gain.set(feedback, time, rampType);\n    },\n\n    $mix: function (value, time, rampType) {\n      this._dry.gain.set(1.0 - value, time, rampType);\n      this._dry.gain.set(value, time, rampType);\n    }\n\n  };\n\n  WX.PlugIn.extendPrototype(Chorus, 'Processor');\n  WX.PlugIn.register(Chorus);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/ConVerb/converb.js",
    "content": "/**\n * @wapl ConVerb\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n(function (WX) {\n\n  'use strict';\n\n  /** REQUIRED: plug-in constructor **/\n  function ConVerb(preset) {\n\n    // REQUIRED: define plug-in type\n    WX.PlugIn.defineType(this, 'Processor');\n\n    // any flags or instance variables\n    this.ready = false;\n    this.clip = null;\n\n    // node creation and patching\n    this._dry = WX.Gain();\n    this._wet = WX.Gain();\n    this._convolver = WX.Convolver();\n    this._input.to(this._dry, this._convolver);\n    this._convolver.to(this._wet);\n    this._dry.to(this._output);\n    this._wet.to(this._output);\n\n    // define parameters\n    WX.defineParams(this, {\n\n      mix: {\n        type: 'Generic',\n        name: 'Mix',\n        default: 0.2,\n        min: 0.0,\n        max: 1.0\n      }\n\n    });\n\n    // REQUIRED: initializing instance with preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  /** REQUIRED: plug-in prototype **/\n  ConVerb.prototype = {\n\n    // REQUIRED: plug-in info\n    info: {\n      name: 'ConVerb',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Processor',\n      description: 'Convolution Reverb'\n    },\n\n    // REQUIRED: plug-in default preset\n    defaultPreset: {\n      mix: 0.2\n    },\n\n    /** handlers **/\n    $mix: function (value, time, rampType) {\n      this._dry.gain.set(1.0 - value, time, rampType);\n      this._wet.gain.set(value, time, rampType);\n    },\n\n    _onprogress: function (event, clip) {\n\n    },\n\n    _onloaded: function (clip) {\n      this.setClip(clip);\n    },\n\n    isReady: function () {\n      return this.ready;\n    },\n\n    setClip: function (clip) {\n      this.clip = clip;\n      this._convolver.buffer = this.clip.buffer;\n      this.ready = true;\n    },\n\n    loadClip: function (clip) {\n      WX.loadClip(\n        clip,\n        this._onloaded.bind(this),\n        this._onprogress.bind(this)\n      );\n    }\n  };\n\n  // REQUIRED: extending plug-in prototype with modules\n  WX.PlugIn.extendPrototype(ConVerb, 'Processor');\n\n  // REQUIRED: registering plug-in into WX ecosystem\n  WX.PlugIn.register(ConVerb);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/EQ4/eq4.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n(function (WX) {\n\n  'use strict';\n\n  // Internal unit biqual filter\n  function UnitFilter(filterType, frequency) {\n    this._input = WX.Gain();\n    this._bypass = WX.Gain();\n    this._biquad = WX.Filter();\n    this._input.to(this._biquad);\n    this._bypass.gain.value = 0.0;\n    this._biquad.type = filterType;\n    this._biquad.frequency.value = frequency;\n    this._active = true;\n  }\n\n  UnitFilter.prototype = {\n\n    setInput: function (inputNode) {\n      inputNode.to(this._input, this._bypass);\n    },\n\n    setOutput: function (outputNode) {\n      this._biquad.to(outputNode);\n      this._bypass.to(outputNode);\n    },\n\n    cascade: function (unitFilter) {\n      this._biquad.to(unitFilter._input, unitFilter._bypass);\n      this._bypass.to(unitFilter._input, unitFilter._bypass);\n    },\n\n    toggle: function (bool) {\n      this._active = bool;\n      if (this._active) {\n        this._input.gain.value = 1.0;\n        this._bypass.gain.value = 0.0;\n      } else {\n        this._input.gain.value = 0.0;\n        this._bypass.gain.value = 1.0;\n      }\n    },\n\n    setFilterType: function (filterType) {\n      this._biquad.type = filterType;\n    },\n\n    setAll: function (freq, Q, gain, time, rampType) {\n      this._biquad.frequency.set(freq, time, rampType);\n      this._biquad.Q.set(Q, time, rampType);\n      this._biquad.gain.set(gain, time, rampType);\n    },\n\n    setFrequency: function (value, time, rampType) {\n      this._biquad.frequency.set(value, time, rampType);\n    },\n\n    setQ: function (value, time, rampType) {\n      this._biquad.Q.set(value, time, rampType);\n    },\n\n    setGain: function (value, time, rampType) {\n      this._biquad.gain.set(value, time, rampType);\n    },\n\n    // TO FIX: for filter graph drawing.\n    getFrequencyResponse: function (canvasWidth, numOctaves) {\n      var frequencyHz = new Float32Array(canvasWidth);\n      var magResponse = new Float32Array(canvasWidth);\n      var phaseResponse = new Float32Array(canvasWidth);\n      var nyquist = 0.5 * WX.srate;\n      for (var i = 0; i < width; ++i) {\n        // Convert to log frequency scale (octaves).\n        frequencyHz[i] = nyquist * Math.pow(2.0, noctaves * (i / width - 1.0));\n      }\n      filter.getFrequencyResponse(frequencyHz, magResponse, phaseResponse);\n\n      return {\n        freq: frequencyHz,\n        mag: magResponse\n      };\n    }\n\n  };\n\n\n  /**\n   * Implements a standard 4-band parametric equalizer.\n   * @type {WAPL}\n   * @param {Object} preset Parameter preset.\n   * @param {Boolean} preset.band1Active Band 1 active switch.\n   * @param {Itemized} preset.band1Type Band 1 filter type.\n   * @param {Number} preset.band1Freq Band 1 frequency.\n   * @param {Number} preset.band1Q Band 1 Q.\n   * @param {Number} preset.band1Gain Band 1 gain (decibels).\n   * @param {Boolean} preset.band2Active Band 2 active switch.\n   * @param {Itemized} preset.band2Type Band 2 filter type.\n   * @param {Number} preset.band2Freq Band 2 frequency.\n   * @param {Number} preset.band2Q Band 2 Q.\n   * @param {Number} preset.band2Gain Band 2 gain (decibels).\n   * @param {Boolean} preset.band3Active Band 3 active switch.\n   * @param {Itemized} preset.band3Type Band 3 filter type.\n   * @param {Number} preset.band3Freq Band 3 frequency.\n   * @param {Number} preset.band3Q Band 3 Q.\n   * @param {Number} preset.band3Gain Band 3 gain (decibels).\n   * @param {Boolean} preset.band4Active Band 4 active switch.\n   * @param {Itemized} preset.band4Type Band 4 filter type.\n   * @param {Number} preset.band4Freq Band 4 frequency.\n   * @param {Number} preset.band4Q Band 4 Q.\n   * @param {Number} preset.band4Gain Band 4 gain (decibels).\n   */\n  function EQ4(preset) {\n\n    WX.PlugIn.defineType(this, 'Processor');\n\n    this._band1 = new UnitFilter('lowshelf', 80);\n    this._band2 = new UnitFilter('peaking', 500);\n    this._band3 = new UnitFilter('peaking', 3500);\n    this._band4 = new UnitFilter('highshelf', 10000);\n\n    this._band1.setInput(this._input);\n    this._band1.cascade(this._band2);\n    this._band2.cascade(this._band3);\n    this._band3.cascade(this._band4);\n    this._band4.setOutput(this._output);\n\n    // define parameters\n    WX.defineParams(this, {\n\n      band1Active: {\n        type: 'Boolean',\n        name: 'On 1',\n        default: true\n      },\n\n      band1Type: {\n        type: 'Itemized',\n        name: 'Type 1',\n        default: 'lowshelf',\n        model: WX.FILTER_TYPES\n      },\n\n      band1Freq: {\n        type: 'Generic',\n        name: 'Freq 1',\n        default: 80,\n        min: 10,\n        max: WX.srate * 0.5,\n        unit: 'Hertz'\n      },\n\n      band1Q: {\n        type: 'Generic',\n        name: 'Q 1',\n        default: 0.0,\n        min: 0.01,\n        max: 1000\n      },\n\n      band1Gain: {\n        type: 'Generic',\n        name: 'Gain 1',\n        default: 0.0,\n        min: -40,\n        max: 40,\n        unit: 'Decibels'\n      },\n\n      band2Active: {\n        type: 'Boolean',\n        name: 'On 2',\n        default: true\n      },\n\n      band2Type: {\n        type: 'Itemized',\n        name: 'Type 2',\n        default: 'peaking',\n        model: WX.FILTER_TYPES\n      },\n\n      band2Freq: {\n        type: 'Generic',\n        name: 'Freq 2',\n        default: 500,\n        min: 10,\n        max: WX.srate * 0.5,\n        unit: 'Hertz'\n      },\n\n      band2Q: {\n        type: 'Generic',\n        name: 'Q 2',\n        default: 0.0,\n        min: 0.01,\n        max: 1000\n      },\n\n      band2Gain: {\n        type: 'Generic',\n        name: 'Gain 2',\n        default: 0.0,\n        min: -40,\n        max: 40,\n        unit: 'Decibels'\n      },\n\n      band3Active: {\n        type: 'Boolean',\n        name: 'On 3',\n        default: true\n      },\n\n      band3Type: {\n        type: 'Itemized',\n        name: 'Type 3',\n        default: 'peaking',\n        model: WX.FILTER_TYPES\n      },\n\n      band3Freq: {\n        type: 'Generic',\n        name: 'Freq 3',\n        default: 3500,\n        min: 10,\n        max: WX.srate * 0.5,\n        unit: 'Hertz'\n      },\n\n      band3Q: {\n        type: 'Generic',\n        name: 'Q 3',\n        default: 0.0,\n        min: 0.01,\n        max: 1000\n      },\n\n      band3Gain: {\n        type: 'Generic',\n        name: 'Gain 3',\n        default: 0.0,\n        min: -40,\n        max: 40,\n        unit: 'Decibels'\n      },\n\n      band4Active: {\n        type: 'Boolean',\n        name: 'On 4',\n        default: true\n      },\n\n      band4Type: {\n        type: 'Itemized',\n        name: 'Type 4',\n        default: 'highshelf',\n        model: WX.FILTER_TYPES\n      },\n\n      band4Freq: {\n        type: 'Generic',\n        name: 'Freq 4',\n        default: 12000,\n        min: 10,\n        max: WX.srate * 0.5,\n        unit: 'Hertz'\n      },\n\n      band4Q: {\n        type: 'Generic',\n        name: 'Q 4',\n        default: 0.0,\n        min: 0.01,\n        max: 1000\n      },\n\n      band4Gain: {\n        type: 'Generic',\n        name: 'Gain 4',\n        default: 0.0,\n        min: -40,\n        max: 40,\n        unit: 'Decibels'\n      }\n\n    });\n\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  EQ4.prototype = {\n\n    info: {\n      name: 'EQ4',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Processor',\n      description: '4-band Parametric Equalizer'\n    },\n\n    defaultPreset: {\n      band1Active: true,\n      band1Type: 'lowshelf',\n      band1Freq: 80,\n      band1Q: 0.0,\n      band1Gain: 0.0,\n      band2Active: true,\n      band2Type: 'peaking',\n      band2Freq: 500,\n      band2Q: 0.0,\n      band2Gain: 0.0,\n      band3Active: true,\n      band3Type: 'peaking',\n      band3Freq: 3500,\n      band3Q: 0.0,\n      band3Gain: 0.0,\n      band4Active: true,\n      band4Type: 'highshelf',\n      band4Freq: 12000,\n      band4Q: 0.0,\n      band4Gain: 0.0\n    },\n\n    $band1Active: function (value, time, rampType) {\n      this._band1.toggle(value);\n    },\n\n    $band1Type: function (value, time, rampType) {\n      this._band1.setFilterType(value);\n    },\n\n    $band1Freq: function (value, time, rampType) {\n      this._band1.setFrequency(value, time, rampType);\n    },\n\n    $band1Q: function (value, time, rampType) {\n      this._band1.setQ(value, time, rampType);\n    },\n\n    $band1Gain: function (value, time, rampType) {\n      this._band1.setGain(value, time, rampType);\n    },\n\n    $band2Active: function (value, time, rampType) {\n      this._band2.toggle(value);\n    },\n\n    $band2Type: function (value, time, rampType) {\n      this._band2.setFilterType(value);\n    },\n\n    $band2Freq: function (value, time, rampType) {\n      this._band2.setFrequency(value, time, rampType);\n    },\n\n    $band2Q: function (value, time, rampType) {\n      this._band2.setQ(value, time, rampType);\n    },\n\n    $band2Gain: function (value, time, rampType) {\n      this._band2.setGain(value, time, rampType);\n    },\n\n    $band3Active: function (value, time, rampType) {\n      this._band3.toggle(value);\n    },\n\n    $band3Type: function (value, time, rampType) {\n      this._band3.setFilterType(value);\n    },\n\n    $band3Freq: function (value, time, rampType) {\n      this._band3.setFrequency(value, time, rampType);\n    },\n\n    $band3Q: function (value, time, rampType) {\n      this._band3.setQ(value, time, rampType);\n    },\n\n    $band3Gain: function (value, time, rampType) {\n      this._band3.setGain(value, time, rampType);\n    },\n\n    $band4Active: function (value, time, rampType) {\n      this._band4.toggle(value);\n    },\n\n    $band4Type: function (value, time, rampType) {\n      this._band4.setFilterType(value);\n    },\n\n    $band4Freq: function (value, time, rampType) {\n      this._band4.setFrequency(value, time, rampType);\n    },\n\n    $band4Q: function (value, time, rampType) {\n      this._band4.setQ(value, time, rampType);\n    },\n\n    $band4Gain: function (value, time, rampType) {\n      this._band4.setGain(value, time, rampType);\n    }\n\n  };\n\n  WX.PlugIn.extendPrototype(EQ4, 'Processor');\n  WX.PlugIn.register(EQ4);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/FMK1/fmk1.js",
    "content": "/**\n * @wapl FMK1\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n\n(function (WX) {\n\n  'use strict';\n\n  /**\n   * FMOperator class.\n   * @param {[type]} outputNode [description]\n   */\n  function FMVoice(synth) {\n    this.parent = synth;\n    this.params = synth.params;\n    this.voiceKey = null;\n    this._minDur = null;\n\n    this._mod = WX.OSC();\n    this._modGain = WX.Gain();\n    this._car = WX.OSC();\n    this._carGain = WX.Gain();\n    this._mod.to(this._modGain);\n    this._modGain.connect(this._car.frequency);\n    this._car.to(this._carGain).to(this.parent._filter);\n\n    this._mod2 = WX.OSC();\n    this._modGain2 = WX.Gain();\n    this._car2 = WX.OSC();\n    this._carGain2 = WX.Gain();\n    this._mod2.to(this._modGain2);\n    this._modGain2.connect(this._car2.frequency);\n    this._car2.to(this._carGain2).to(this.parent._filter);\n  }\n\n  FMVoice.prototype = {\n\n    noteOn: function (pitch, velocity, time) {\n      var p = this.params,\n          freq = WX.mtof(pitch),\n          hr = p.harmonicRatio.get(),\n          mi = p.modulationIndex.get(),\n          att = p.attack.get(),\n          dec = p.decay.get(),\n          sus = p.sustain.get(),\n          bal = p.balance.get(),\n          scale = WX.veltoamp(velocity);\n      // 1: start generation\n      this._mod.start(time);\n      this._car.start(time);\n      // set fm parameters: freq, hr, mi-attack, mi-decay\n      this._car.frequency.set(freq, time, 0);\n      this._mod.frequency.set(freq * hr, time, 0);\n      this._modGain.gain.set(freq * hr * mi, time, 0);\n      this._modGain.gain.set(0.1, time + 1.5, 2);\n      // envelope: ads\n      this._carGain.gain.set(0.0, time, 0);\n      this._carGain.gain.set(scale * bal, time + att, 1);\n      this._carGain.gain.set(sus * scale * bal, [time + att, dec], 3);\n      // 2: start generation\n      this._mod2.start(time);\n      this._car2.start(time);\n      // set fm parameters: freq, hr, mi-attack, mi-decay\n      this._car2.frequency.set(freq * 2, time, 0);\n      this._mod2.frequency.set(freq * hr, time, 0);\n      this._modGain2.gain.set(freq * hr * mi * 0.5, time, 0);\n      this._modGain2.gain.set(0.5, time + 1.5, 2);\n      // envelope: ads\n      this._carGain2.gain.set(0.0, time, 0);\n      this._carGain2.gain.set(scale * (1 - bal), time + att, 1);\n      this._carGain2.gain.set(sus * scale * (1 - bal), [time + att, dec], 3);\n      // get minDur\n      this.minDur = time + att + dec;\n    },\n\n    noteOff: function (pitch, velocity, time) {\n      if (this.minDur) {\n        time = time < WX.now ? WX.now : time;\n        var p = this.params,\n            rel = p.release.get();\n        this.voiceKey = pitch;\n        this._mod.stop(this.minDur + rel + 2.0);\n        this._car.stop(this.minDur + rel + 2.0);\n        this._mod2.stop(this.minDur + rel + 2.0);\n        this._car2.stop(this.minDur + rel + 2.0);\n        if (time < this.minDur) {\n          this._carGain.gain.cancel(this.minDur);\n          this._carGain.gain.set(0.0, [this.minDur, rel], 3);\n          this._carGain2.gain.cancel(this.minDur);\n          this._carGain2.gain.set(0.0, [this.minDur, rel], 3);\n        } else {\n          this._carGain.gain.set(0.0, [time, rel], 3);\n          this._carGain2.gain.set(0.0, [time, rel], 3);\n        }\n      }\n    }\n\n  };\n\n  // REQUIRED: plug-in constructor\n  function FMK1(preset) {\n\n    // REQUIRED: adding necessary modules\n    WX.PlugIn.defineType(this, 'Generator');\n\n    this.numVoice = 0;\n    // naive voice management\n    this.voices = [];\n    for (var i = 0; i < 128; i++) {\n      this.voices[i] = [];\n    }\n\n    // patching\n    this._filter = WX.Filter();\n    this._filter.to(this._output);\n\n    // parameter definition\n    WX.defineParams(this, {\n\n      harmonicRatio: {\n        type: 'Generic',\n        name: 'HRatio',\n        default: 4,\n        min: 1,\n        max: 60\n      },\n\n      modulationIndex: {\n        type: 'Generic',\n        name: 'ModIdx',\n        default: 1,\n        min: 0.0,\n        max: 2.0\n      },\n\n      attack: {\n        type: 'Generic',\n        name: 'Att',\n        default: 0.005,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      decay: {\n        type: 'Generic',\n        name: 'Dec',\n        default: 0.04,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      sustain: {\n        type: 'Generic',\n        name: 'Sus',\n        default: 0.25,\n        min: 0.0,\n        max: 1.0\n      },\n\n      release: {\n        type: 'Generic',\n        name: 'Rel',\n        default: 0.2,\n        min: 0.0,\n        max: 10.0,\n        unit: 'Seconds'\n      },\n\n      balance: {\n        type: 'Generic',\n        name: 'Balance',\n        default: 0.5,\n        min: 0.0,\n        max: 1.0\n      },\n\n      filterType: {\n        type: 'Itemized',\n        name: 'FiltType',\n        default: 'highshelf',\n        model: WX.FILTER_TYPES\n      },\n\n      filterFrequency: {\n        type: 'Generic',\n        name: 'FiltFreq',\n        default: 2500,\n        min: 20,\n        max: 20000,\n        unit: 'Hertz'\n      },\n\n      filterQ: {\n        type: 'Generic',\n        name: 'FiltQ',\n        default: 0.0,\n        min: 0.0,\n        max: 40.0\n      },\n\n      filterGain: {\n        type: 'Generic',\n        name: 'FiltGain',\n        default: 0.0,\n        min: -40.0,\n        max: 40.0,\n        unit: 'Decibels'\n      }\n\n    });\n\n    // REQUIRED: initializing instance with preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  /** REQUIRED: plug-in prototype **/\n  FMK1.prototype = {\n\n    // REQUIRED: plug-in info\n    info: {\n      name: 'FMK1',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Generator',\n      description: 'FM Bell-based Keys'\n    },\n\n    // REQUIRED: plug-in default preset\n    defaultPreset: {\n      harmonicRatio: 10,\n      modulationIndex: 1.8,\n      attack: 0.002,\n      decay: 0.03,\n      sustain: 0.65,\n      release: 0.55,\n      balance: 0.7165,\n      filterType: 'highshelf',\n      filterFrequency: 7000,\n      filterQ: 0.0,\n      filterGain: -3.0,\n      output: 0.3\n    },\n\n    // REQUIRED: handlers for each parameter\n    $balance: function (value, time, rampType) {\n\n    },\n\n    $filterType: function (value, time, rampType) {\n      this._filter.type = value;\n    },\n\n    $filterFrequency: function (value, time, rampType) {\n      this._filter.frequency.set(value, time, rampType);\n    },\n\n    $filterQ: function (value, time, rampType) {\n      this._filter.Q.set(value, time, rampType);\n    },\n\n    $filterGain: function (value, time, rampType) {\n      this._filter.gain.set(value, time, rampType);\n    },\n\n    noteOn: function (pitch, velocity, time) {\n      time = (time || WX.now);\n      var voice = new FMVoice(this);\n      this.voices[pitch].push(voice);\n      this.numVoice++;\n      voice.noteOn(pitch, velocity, time);\n    },\n\n    noteOff: function (pitch, velocity, time) {\n      time = (time || WX.now);\n      var playing = this.voices[pitch];\n      for (var i = 0; i < playing.length; i++) {\n        playing[i].noteOff(pitch, velocity, time);\n        this.numVoice--;\n      }\n      // TODO: is this performant enough?\n      this.voices[pitch] = [];\n    },\n\n    onData: function (action, data) {\n      switch (action) {\n        case 'noteon':\n          this.noteOn(data.pitch, data.velocity);\n          break;\n        case 'noteoff':\n          this.noteOff(data.pitch, data.velocity);\n          break;\n      }\n    }\n\n  };\n\n  // REQUIRED: extending plug-in prototype with modules\n  WX.PlugIn.extendPrototype(FMK1, 'Generator');\n\n  // REQUIRED: registering plug-in into WX ecosystem\n  WX.PlugIn.register(FMK1);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/Fader/fader.js",
    "content": "/**\n * @wapl Fader\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n(function (WX) {\n\n  function Fader(preset) {\n    // adding modules\n    WX.PlugIn.defineType(this, 'Processor');\n\n    // node creation and patching\n    // this._panner = WX.Panner();\n    // this._input.to(this._panner).to(this._output);\n    \n    this._input.to(this._output);\n\n    // this._panner.panningModel = 'equalpower';\n\n    WX.defineParams(this, {\n\n      output: {\n        type: 'Generic',\n        name: 'Output',\n        default: 1.0,\n        min: 0.0,\n        max: 3.9810717055349722,\n        unit: 'LinearGain'\n      },\n\n      mute: {\n        type: 'Boolean',\n        name: 'Mute',\n        default: false\n      },\n\n      // pan: {\n      //   type: 'Generic',\n      //   name: 'Pan',\n      //   default: 0.0,\n      //   min: -1.0,\n      //   max: 1.0\n      // },\n\n      dB: {\n        type: 'Generic',\n        name: 'dB',\n        default: 0.0,\n        min: -60,\n        max: 12.0,\n        unit: 'Decibels'\n      }\n\n    });\n\n    // initialize preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  Fader.prototype = {\n\n    info: {\n      name: 'Fader',\n      version: '0.0.3',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Processor',\n      description: 'Channel Fader'\n    },\n\n    defaultPreset: {\n      mute: false,\n      // pan: 0.0,\n      dB: 0.0\n    },\n\n    $mute: function (value, time, rampType) {\n      if (value) {\n        this._outlet.gain.set(0.0, WX.now, 0);\n      } else {\n        this._outlet.gain.set(1.0, WX.now, 0);\n      }\n    },\n\n    // $pan: function (value, time, rampType) {\n    //   // TODO: compensate pan model attenuation (z=0.5)\n    //   this._panner.setPosition(value, 0, 0.5);\n    // },\n\n    $dB: function (value, time, rampType) {\n      this.params.output.set(WX.dbtolin(value), time, rampType);\n      // console.log(this);\n      // this._output.gain.set(WX.dbtolin(value), WX.now + 0.02, 1);\n    }\n\n  };\n\n  WX.PlugIn.extendPrototype(Fader, 'Processor');\n  WX.PlugIn.register(Fader);\n\n  // NOTE: built in master output fader\n  WX.Master = WX.Fader();\n  WX.Master.to(WX._ctx.destination);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/FilterBank/filterbank.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n(function (WX) {\n\n  'use strict';\n\n  // Pre-defined scales: ionian, lydian, aeolian, and mixolydian.\n  var SCALES = [\n    { key: 'Ionian', value: 'ionian' },\n    { key: 'Lydian', value: 'lydian' },\n    { key: 'Mixolydian', value: 'mixolydian' },\n    { key: 'Aeolian', value: 'aeolian' }\n  ];\n\n  // Pitch class for scales.\n  var PITCHES = {\n    'ionian': [0, 7, 14, 21, 28, 35, 43, 48],\n    'lydian': [0, 6, 16, 21, 26, 35, 42, 48],\n    'mixolydian': [0, 5, 16, 23, 26, 33, 41, 48],\n    'aeolian': [0, 7, 15, 22, 26, 34, 39, 48]\n  };\n\n  // Number of bands. A band is consist of cascaded two bandpass filters.\n  var NUM_BANDS = 8;\n\n  /**\n   * Implements harmonized 8-band filterbank.\n   * @type {WAPL}\n   * @param {Object} preset Parameter preset.\n   * @param {Number} preset.pitch\n   * @param {Number} preset.scale\n   * @param {Number} preset.slope\n   * @param {Number} preset.width\n   * @param {Number} preset.detune\n   */\n  function FilterBank(preset) {\n\n    WX.PlugIn.defineType(this, 'Processor');\n\n    // Cascading 2 filters (serial connection) for sharp resonance.\n    this._filters1 = [];\n    this._filters2 = [];\n    this._gains = [];\n    this._summing = WX.Gain();\n    for (var i = 0; i < NUM_BANDS; ++i) {\n      this._filters1[i] = WX.Filter();\n      this._filters2[i] = WX.Filter();\n      this._gains[i] = WX.Gain();\n      this._filters1[i].type = 'bandpass';\n      this._filters2[i].type = 'bandpass';\n      this._input.to(this._filters1[i]);\n      this._filters1[i].to(this._filters2[i]).to(this._gains[i]);\n      this._gains[i].to(this._summing);\n    }\n    this._summing.to(this._output);\n\n    // Gain compensation. The resulting loudness of filterbank is fairly small.\n    this._summing.gain.value = 35.0;\n\n    // Parameter definition\n    WX.defineParams(this, {\n\n      pitch: {\n        type: 'Generic',\n        name: 'Pitch',\n        default: 24,\n        min: 12,\n        max: 48\n      },\n\n      scale: {\n        type: 'Itemized',\n        name: 'Scale',\n        default: 'lydian',\n        model: SCALES\n      },\n\n      slope: {\n        type: 'Generic',\n        name: 'Harmonics',\n        default: 0.26,\n        min: 0.1,\n        max: 0.75\n      },\n\n      width: {\n        type: 'Generic',\n        name: 'Width',\n        default: 0.49,\n        min: 0.0,\n        max: 1.0\n      },\n\n      detune: {\n        type: 'Generic',\n        name: 'Detune',\n        default: 0.0,\n        min: 0.0,\n        max: 1.0\n      }\n\n    });\n\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  FilterBank.prototype = {\n\n    info: {\n      name: 'FilterBank',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Processor',\n      description: 'Harmonized 8-band filterbank'\n    },\n\n    defaultPreset: {\n      pitch: 34,\n      scale: 'lydian',\n      slope: 0.65,\n      width: 0.15,\n      detune: 0.0\n    },\n\n    // Change frequency of filters\n    $pitch: function (value, time, rampType) {\n      var f0 = WX.mtof(value);\n      for (var i = 0; i < NUM_BANDS; i++) {\n        this._filters1[i].frequency.set(f0, time, rampType);\n        this._filters2[i].frequency.set(f0, time, rampType);\n      }\n    },\n\n    // Change detune of filters. (Note that this is in cents.)\n    $scale: function (value, time, rampType) {\n      time = (WX.now || time);\n      var pitches = PITCHES[value];\n      for (var i = 1; i < NUM_BANDS; i++) {\n        this._filters1[i].detune.set(pitches[i] * 100, time, rampType);\n        this._filters2[i].detune.set(pitches[i] * 100, time, rampType);\n      }\n    },\n\n    $slope: function (value, time, rampType) {\n      for (var i = 0; i < NUM_BANDS; i++) {\n        // Gain balancing formula.\n        var gain = 1.0 + Math.sin(Math.PI + (Math.PI/2 * (value + i/NUM_BANDS)));\n        this._gains[i].gain.set(gain, time, rampType);\n      }\n    },\n\n    $width: function (value, time, rampType) {\n      for (var i = 1; i < NUM_BANDS; i++) {\n        // Q formula.\n        var q = 2 + 90 * Math.pow((1 - i / NUM_BANDS), value);\n        this._filters1[i].Q.set(q, time, rampType);\n        this._filters2[i].Q.set(q, time, rampType);\n      }\n    },\n\n    // TO FIX: detune handler\n    $detune: function (value, time, rampType) {\n\n    },\n\n    getScaleModel: function () {\n      return SCALES.slice(0);\n    }\n\n    // TO FIX: noteon, noteoff. Interactive features.\n\n  };\n\n  WX.PlugIn.extendPrototype(FilterBank, 'Processor');\n  WX.PlugIn.register(FilterBank);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/Impulse/Impulse.js",
    "content": "/**\n * @wapl Impulse\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n(function (WX) {\n\n  'use strict';\n\n  // pre-generation of impulse data\n  // NOTE: static data for all Impulse instances\n  var binSize = 2048,\n      mag = new Float32Array(binSize),\n      phase = new Float32Array(binSize);\n  for (var i = 0; i < binSize; ++i) {\n    mag[i] = 1.0;\n    phase[i] = 0.0;\n  }\n  var DATA = WX.PeriodicWave(mag, phase);\n\n  /** REQUIRED: plug-in constructor **/\n  function Impulse(preset) {\n\n    // REQUIRED: adding necessary modules\n    WX.PlugIn.defineType(this, 'Generator');\n\n    this._impulse = WX.OSC();\n    this._impulse.to(this._output);\n    this._impulse.start(0);\n\n    this._impulse.setPeriodicWave(DATA);\n\n    WX.defineParams(this, {\n\n      freq: {\n        type: 'Generic',\n        name: 'Freq',\n        default: 1.0,\n        min: 0.1,\n        max: 60.0,\n        unit: 'Hertz'\n      }\n\n    });\n\n    // REQUIRED: initializing instance with preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  /** REQUIRED: plug-in prototype **/\n  Impulse.prototype = {\n\n    // REQUIRED: plug-in info\n    info: {\n      name: 'Impulse',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Generator',\n      description: 'Impulse (train) Generator'\n    },\n\n    // REQUIRED: plug-in default preset\n    defaultPreset: {\n      freq: 1.0\n    },\n\n    // REQUIRED: if you have a parameter,\n    //           corresponding handler is required.\n    $freq: function (value, time, rampType) {\n      this._impulse.frequency.set(value, time, rampType);\n    }\n\n  };\n\n  // REQUIRED: extending plug-in prototype with modules\n  WX.PlugIn.extendPrototype(Impulse, 'Generator');\n\n  // REQUIRED: registering plug-in into WX ecosystem\n  WX.PlugIn.register(Impulse);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/Noise/noise.js",
    "content": "/**\n * @wapl Noise\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n(function (WX) {\n\n  'use strict';\n\n  // const noise type\n  var NOISETYPE = [\n    { key: 'White', value: 'white' },\n    { key: 'Pink', value: 'pink' }\n  ];\n\n  // pre-generation of gaussian white noise\n  // http://www.musicdsp.org/showone.php?id=113\n  function createGaussian(duration) {\n    var length = Math.floor(WX.srate * duration);\n    var noiseFloat32 = new Float32Array(length);\n    for (var i = 0; i < length; i++) {\n      var r1 = Math.log(Math.random()), r2 = Math.PI * Math.random();\n      noiseFloat32[i] = Math.sqrt(-2.0 * r1) * Math.cos(2.0 * r2) * 0.5;\n    }\n    var noiseBuffer = WX.Buffer(2, length, WX.srate);\n    noiseBuffer.getChannelData(0).set(noiseFloat32, 0);\n    noiseBuffer.getChannelData(1).set(noiseFloat32, 0);\n    return noiseBuffer;\n  }\n\n  // NEEDS TO BE TESTED\n  // pre-generation of pink noise\n  // http://home.earthlink.net/~ltrammell/tech/pinkalg.htm\n  // http://home.earthlink.net/~ltrammell/tech/pinkgen.c\n  function createPink(duration) {\n    var length = Math.floor(WX.srate * duration);\n    var noiseFloat32 = new Float32Array(length);\n    // pink noise specific\n    var pA = [3.8024, 2.9694, 2.5970, 3.0870, 3.4006],\n        pSum = [0.00198, 0.01478, 0.06378, 0.23378, 0.91578],\n        pASum = 15.8564,\n        sample = 0,\n        contrib = [0.0, 0.0, 0.0, 0.0, 0.0];\n    for (var i = 0; i < length; i++) {\n      var ur1 = Math.random(), ur2 = Math.random();\n      for (var j = 0; j < 5; j++) {\n        if (ur1 <= pSum[j]) {\n          sample -= contrib[j];\n          contrib[j] = 2 * (ur2 - 0.5) * pA[j];\n          sample += contrib[j];\n          break;\n        }\n      }\n      noiseFloat32[i] = sample / pASum;\n    }\n    // console.log(noiseFloat32); // debug\n    var noiseBuffer = WX.Buffer(2, length, WX.srate);\n    noiseBuffer.getChannelData(0).set(noiseFloat32, 0);\n    noiseBuffer.getChannelData(1).set(noiseFloat32, 0);\n    return noiseBuffer;\n  }\n\n  var _baseBufferGaus = createGaussian(10.0),\n      _baseBufferPink = createPink(10.0);\n\n\n  /**\n   * [Noise description]\n   * @param {[type]} preset [description]\n   */\n  function Noise(preset) {\n\n    // REQUIRED: adding necessary modules\n    WX.PlugIn.defineType(this, 'Generator');\n\n    this._bufferGaus = createGaussian(9.73);\n    this._bufferPink = createPink(9.73);\n\n    this._src1 = WX.Source();\n    this._src2 = WX.Source();\n    this._src1.to(this._output);\n    this._src2.to(this._output);\n    this._src1.loop = true;\n    this._src2.loop = true;\n    this._src1.start(0);\n    this._src2.start(0);\n\n    WX.defineParams(this, {\n\n      type: {\n        type: 'Itemized',\n        name: 'Type',\n        default: 'white',\n        model: NOISETYPE\n      }\n\n    });\n\n    // REQUIRED: initializing instance with preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  /** REQUIRED: plug-in prototype **/\n  Noise.prototype = {\n\n    // REQUIRED: plug-in info\n    info: {\n      name: 'Noise',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Generator',\n      description: 'White and Pink Noise Generator'\n    },\n\n    // REQUIRED: plug-in default preset\n    defaultPreset: {\n      type: 'white'\n    },\n\n    $type: function (value, time, rampType) {\n      switch (value) {\n        case 'white':\n          this._src1.buffer = _baseBufferGaus;\n          this._src2.buffer = this._bufferGaus;\n          this._src1.loopStart = Math.random() * 10.0;\n          break;\n        case 'pink':\n          this._src1.buffer = _baseBufferPink;\n          this._src2.buffer = this._bufferPink;\n          this._src1.loopStart = Math.random() * 10.0;\n          break;\n      }\n    }\n\n  };\n\n  // REQUIRED: extending plug-in prototype with modules\n  WX.PlugIn.extendPrototype(Noise, 'Generator');\n\n  // REQUIRED: registering plug-in into WX ecosystem\n  WX.PlugIn.register(Noise);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/SP1/sp1.js",
    "content": "/**\n * @wapl SP1\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n\n// TODO\n// - filter? mod?\n// -\n\n(function (WX) {\n\n  'use strict';\n\n  // internal abstraction for polyphony impl\n  function SP1Voice(sampler) {\n\n    this.parent = sampler;\n    this.params = sampler.params;\n    this.voiceKey = null;\n    this.minDur = null;\n\n    this._src = WX.Source();\n    this._srcGain = WX.Gain();\n    this._src.to(this._srcGain).to(this.parent._filter);\n    this._src.loop = true;\n    this._src.buffer = this.parent.clip.buffer;\n    // this._src.onended = function () {\n    //   // DO SOMETHING\n    // }.bind(this);\n\n  }\n\n  SP1Voice.prototype = {\n\n    noteOn: function (pitch, velocity, time) {\n      var p = this.params,\n          basePitch = p.tune.get(),\n          att = p.ampAttack.get(),\n          dec = p.ampDecay.get(),\n          sus = p.ampSustain.get(),\n          scale = p.velocityMod.get() ? WX.veltoamp(velocity) : 1.0;\n      if (p.pitchMod.get()) {\n        this._src.playbackRate.value = Math.pow(2, (pitch - basePitch) / 12);\n      }\n      this._src.start(time);\n      this._srcGain.gain.set(0.0, time, 0);\n      this._srcGain.gain.set(scale, time + att, 1);\n      this._srcGain.gain.set(sus * scale, [time + att, dec], 3);\n      // calculate minimum duration\n      // if noteOff comes after minDur, cancel AParam is not needed\n      this.minDur = time + att + dec;\n    },\n\n    noteOff: function (pitch, velocity, time) {\n      if (this.minDur) {\n        time = time < WX.now ? WX.now : time;\n        var p = this.params,\n            rel = p.ampRelease.get();\n        this.voiceKey = pitch;\n        this._src.stop(this.minDur + rel + 1.0);\n        // if noteOff happens before minDur\n        // : cancel scheduled ADS envelope and then start releasing\n        if (time < this.minDur) {\n          this._srcGain.gain.cancel(this.minDur);\n          this._srcGain.gain.set(0.0, [this.minDur, rel], 3);\n        } else {\n          this._srcGain.gain.set(0.0, [time, rel], 3);\n        }\n      }\n    }\n\n  };\n\n\n  /** REQUIRED: plug-in constructor **/\n  function SP1(preset) {\n\n    // REQUIRED: adding necessary modules\n    WX.PlugIn.defineType(this, 'Generator');\n\n    this.ready = false;\n    this.clip = null;\n    this.numVoice = 0;\n\n    // naive voice management\n    this.voices = [];\n    for (var i = 0; i < 128; i++) {\n      this.voices[i] = [];\n    }\n\n    // patching\n    this._filter = WX.Filter();\n    this._filter.to(this._output);\n\n    // parameter definition\n    WX.defineParams(this, {\n\n      tune: {\n        type: 'Generic',\n        name: 'Tune',\n        default: 48,\n        min: 0,\n        max: 127,\n        unit: 'Semitone'\n      },\n\n      pitchMod: {\n        type: 'Boolean',\n        name: 'PitchMod',\n        default: true\n      },\n\n      velocityMod: {\n        type: 'Boolean',\n        name: 'VeloMod',\n        default: true\n      },\n\n      ampAttack: {\n        type: 'Generic',\n        name: 'Att',\n        default: 0.02,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      ampDecay: {\n        type: 'Generic',\n        name: 'Dec',\n        default: 0.04,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      ampSustain: {\n        type: 'Generic',\n        name: 'Sus',\n        default: 0.25,\n        min: 0.0,\n        max: 1.0,\n        unit: 'LinearGain'\n      },\n\n      ampRelease: {\n        type: 'Generic',\n        name: 'Rel',\n        default: 0.2,\n        min: 0.0,\n        max: 10.0,\n        unit: 'Seconds'\n      },\n\n      filterType: {\n        type: 'Itemized',\n        name: 'FiltType',\n        default: 'lowpass',\n        model: WX.FILTER_TYPES\n      },\n\n      filterFrequency: {\n        type: 'Generic',\n        name: 'FiltFreq',\n        default: 2500,\n        min: 20,\n        max: 20000,\n        unit: 'Hertz'\n      },\n\n      filterQ: {\n        type: 'Generic',\n        name: 'FiltQ',\n        default: 0.0,\n        min: 0.0,\n        max: 40.0\n      },\n\n      filterGain: {\n        type: 'Generic',\n        name: 'FiltGain',\n        default: 0.0,\n        min: -40.0,\n        max: 40.0,\n        unit: 'LinearGain'\n      }\n\n    });\n\n    // REQUIRED: initializing instance with preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  /** REQUIRED: plug-in prototype **/\n  SP1.prototype = {\n\n    // REQUIRED: plug-in info\n    info: {\n      name: 'SP1',\n      version: '0.0.1',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Generator',\n      description: 'Versatile Single-Zone Sampler'\n    },\n\n    // REQUIRED: plug-in default preset\n    defaultPreset: {\n      tune: 60,\n      pitchMod: true,\n      velocityMod: true,\n      ampAttack: 0.01,\n      ampDecay: 0.44,\n      ampSustain: 0.06,\n      ampRelease: 0.06,\n      filterType: 'LP',\n      filterFrequency: 5000,\n      filterQ: 0.0,\n      filterGain: 0.0,\n      output: 1.0\n    },\n\n    // REQUIRED: if you have a parameter,\n    //           corresponding handler is required.\n    $filterType: function (value, time, rampType) {\n      this._filter.type = value;\n    },\n\n    $filterFrequency: function (value, time, rampType) {\n      this._filter.frequency.set(value, time, rampType);\n    },\n\n    $filterQ: function (value, time, rampType) {\n      this._filter.Q.set(value, time, rampType);\n    },\n\n    $filterGain: function (value, time, rampType) {\n      this._filter.gain.set(value, time, rampType);\n    },\n\n    noteOn: function (pitch, velocity, time) {\n      time = (time || WX.now);\n      var voice = new SP1Voice(this);\n      this.voices[pitch].push(voice);\n      this.numVoice++;\n      voice.noteOn(pitch, velocity, time);\n    },\n\n    noteOff: function (pitch, velocity, time) {\n      time = (time || WX.now);\n      var playing = this.voices[pitch];\n      for (var i = 0; i < playing.length; i++) {\n        playing[i].noteOff(pitch, velocity, time);\n        this.numVoice--;\n      }\n      // TODO: is this performant enough?\n      this.voices[pitch] = [];\n    },\n\n    // realtime input data responder (Ktrl responder)\n    onData: function (action, data) {\n      switch (action) {\n        case 'noteon':\n          this.noteOn(data.pitch, data.velocity);\n          break;\n        case 'noteoff':\n          this.noteOff(data.pitch, data.velocity);\n          break;\n      }\n    },\n\n    _onprogress: function (event, clip) {\n      // TODO\n    },\n\n    _onloaded: function (clip) {\n      this.setClip(clip);\n      WX.Log.info('Clip loaded:', clip.name);\n    },\n\n    onReady: null,\n\n    isReady: function () {\n      return this.ready;\n    },\n\n    setClip: function (clip) {\n      this.clip = clip;\n      this.ready = true;\n      if (this.onReady) {\n        this.onReady();\n      }\n    },\n\n    loadClip: function (clip) {\n      WX.loadClip(\n        clip,\n        this._onloaded.bind(this),\n        this._onprogress.bind(this)\n      );\n    }\n  };\n\n  // REQUIRED: extending plug-in prototype with modules\n  WX.PlugIn.extendPrototype(SP1, 'Generator');\n\n  // REQUIRED: registering plug-in into WX ecosystem\n  WX.PlugIn.register(SP1);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/SimpleOsc/SimpleOsc.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n(function (WX) {\n\n  'use strict';\n\n  /**\n   * Implements SimpleOsc insturment.\n   * @type {WAPL}\n   * @name SimpleOsc\n   * @class\n   * @memberOf WX\n   * @param {Object} preset Parameter preset.\n   * @param {GenericParam} preset.oscType Oscillator type.\n   * @param {GenericParam} preset.oscFreq Oscillator frequency.\n   * @param {ItermizedParam} preset.lfoType LFO type.\n   * @param {GenericParam} preset.lfoRate LFO rate.\n   * @param {GenericParam} preset.lfoDepth LFO depth.\n   */\n  function SimpleOsc(preset) {\n\n    // REQUIRED: adding necessary modules\n    WX.PlugIn.defineType(this, 'Generator');\n\n    // patching, lfo frequency modulation\n    this._lfo = WX.OSC();\n    this._lfoGain = WX.Gain();\n    this._osc = WX.OSC();\n    this._amp = WX.Gain();\n    this._osc.to(this._amp).to(this._output);\n    this._lfo.to(this._lfoGain).to(this._osc.detune);\n    this._lfo.start(0);\n    this._osc.start(0);\n\n    this._amp.gain.value = 0.0;\n\n    // parameter definition\n    WX.defineParams(this, {\n\n      oscType: {\n        type: 'Itemized',\n        name: 'Waveform',\n        default: 'sine', // all code-side representation should be 'value'\n        model: WX.WAVEFORMS\n      },\n\n      oscFreq: {\n        type: 'Generic',\n        name: 'Freq',\n        default: WX.mtof(60),\n        min: 20.0,\n        max: 5000.0,\n        unit: 'Hertz'\n      },\n\n      lfoType: {\n        type: 'Itemized',\n        name: 'LFO Type',\n        default: 'sine',\n        model: WX.WAVEFORMS\n      },\n\n      lfoRate: {\n        type: 'Generic',\n        name: 'Rate',\n        default: 1.0,\n        min: 0.0,\n        max: 20.0,\n        unit: 'Hertz'\n      },\n\n      lfoDepth: {\n        type: 'Generic',\n        name: 'Depth',\n        default: 1.0,\n        min: 0.0,\n        max: 500.0,\n        unit: 'LinearGain'\n      }\n\n    });\n\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  SimpleOsc.prototype = {\n\n    info: {\n      name: 'SimpleOsc',\n      version: '0.0.2',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Generator',\n      description: '1 OSC with LFO'\n    },\n\n    defaultPreset: {\n      oscType: 'sine',\n      oscFreq: WX.mtof(60),\n      lfoType: 'sine',\n      lfoRate: 1.0,\n      lfoDepth: 1.0\n    },\n\n    $oscType: function (value, time, rampType) {\n      this._osc.type = value;\n    },\n\n    $oscFreq: function (value, time, rampType) {\n      this._osc.frequency.set(value, time, rampType);\n    },\n\n    $lfoType: function (value, time, rampType) {\n      this._lfo.type = value;\n    },\n\n    $lfoRate: function (value, time, rampType) {\n      this._lfo.frequency.set(value, time, rampType);\n    },\n\n    $lfoDepth: function (value, time, rampType) {\n      this._lfoGain.gain.set(value, time, rampType);\n    },\n\n    /**\n     * Start a note with pitch, velocity at time in seconds.\n     * @param  {Number} pitch    MIDI pitch\n     * @param  {Number} velocity MIDI velocity.\n     * @param  {Number} time     Time in seconds.\n     */\n    noteOn: function (pitch, velocity, time) {\n      time = (time || WX.now);\n      this._amp.gain.set(velocity / 127, [time, 0.02], 3);\n      this.params.oscFreq.set(WX.mtof(pitch), time + 0.02, 0);\n      // this.$oscFreq(WX.mtof(pitch), time + 0.02, 0);\n    },\n\n    /**\n     * Stop a note at time in seconds.\n     * @param  {Number} time     Time in seconds.\n     */\n    noteOff: function (time) {\n      time = (time || WX.now);\n      this._amp.gain.set(0.0, [time, 0.2], 3);\n    },\n\n    /**\n     * Route incoming event data from other WAAX input devices.\n     * @param  {String} action Action type: ['noteon', 'noteoff']\n     * @param  {Object} data   Event data.\n     * @param  {Object} data.pitch   MIDI Pitch\n     * @param  {Object} data.velocity   MIDI Velocity.\n     */\n    onData: function (action, data) {\n      switch (action) {\n        case 'noteon':\n          this.noteOn(data.pitch, data.velocity);\n          break;\n        case 'noteoff':\n          this.noteOff();\n          break;\n      }\n    }\n  };\n\n  WX.PlugIn.extendPrototype(SimpleOsc, 'Generator');\n  WX.PlugIn.register(SimpleOsc);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/StereoDelay/StereoDelay.js",
    "content": "/**\n * @wapl StereoDelay\n * @author Hongchan Choi (hoch, hongchan.choi@gmail.com)\n */\n(function (WX) {\n\n  'use strict';\n\n  /** REQUIRED: plug-in constructor **/\n  function StereoDelay(preset) {\n\n    // REQUIRED: adding necessary modules\n    WX.PlugIn.defineType(this, 'Processor');\n\n    // patching\n    this._lDelay = WX.Delay();\n    this._rDelay = WX.Delay();\n    this._lFeedback = WX.Gain();\n    this._rFeedback = WX.Gain();\n    this._lXtalk = WX.Gain();\n    this._rXtalk = WX.Gain();\n    this._dry = WX.Gain();\n    this._wet = WX.Gain();\n    var _splitter = WX.Splitter(2);\n    var _merger = WX.Merger(2);\n    // source distribution\n    this._input.to(_splitter, this._dry);\n    // left channel\n    _splitter.connect(this._lDelay, 0);\n    this._lDelay.to(this._lFeedback);\n    this._lFeedback.to(this._lDelay, this._rXtalk);\n    this._lXtalk.to(this._lDelay);\n    this._lDelay.connect(_merger, 0, 0);\n    // right channel\n    // NOTE: splitter only uses left channel feed.\n    // (to be revisited)\n    _splitter.connect(this._rDelay, 0);\n    this._rDelay.to(this._rFeedback);\n    this._rFeedback.to(this._rDelay, this._lXtalk);\n    this._rXtalk.to(this._rDelay);\n    this._rDelay.connect(_merger, 0, 1);\n    // summing\n    _merger.to(this._wet);\n    this._dry.to(this._output);\n    this._wet.to(this._output);\n\n    // parameters\n    WX.defineParams(this, {\n\n      delayTimeLeft: {\n        type: 'Generic',\n        name: 'L Delay',\n        default: 0.125,\n        min: 0.025,\n        max: 5,\n        unit: 'Seconds'\n      },\n\n      delayTimeRight: {\n        type: 'Generic',\n        name: 'R Delay',\n        default: 0.25,\n        min: 0.025,\n        max: 5,\n        unit: 'Seconds'\n      },\n\n      feedbackLeft: {\n        type: 'Generic',\n        name: 'L FB',\n        default: 0.25,\n        min: 0.0,\n        max: 1.0\n      },\n\n      feedbackRight: {\n        type: 'Generic',\n        name: 'R FB',\n        default: 0.125,\n        min: 0.0,\n        max: 1.0\n      },\n\n      crosstalk: {\n        type: 'Generic',\n        name: 'Crosstalk',\n        default: 0.1,\n        min: 0.0,\n        max: 1.0\n      },\n\n      mix: {\n        type: 'Generic',\n        name: 'Mix',\n        default: 0.2,\n        min: 0.0,\n        max: 1.0\n      }\n\n    });\n\n    // REQUIRED: initializing instance with preset\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  /** REQUIRED: plug-in prototype **/\n  StereoDelay.prototype = {\n\n    // REQUIRED: plug-in info\n    info: {\n      name: 'StereoDelay',\n      version: '0.0.3',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Processor',\n      description: 'Pingpong Delay with Feedback Control'\n    },\n\n    // REQUIRED: plug-in default preset\n    defaultPreset: {\n      delayTimeLeft: 0.125,\n      delayTimeRight: 0.250,\n      feedbackLeft: 0.250,\n      feedbackRight: 0.125,\n      crosstalk: 0.1,\n      mix: 0.2\n    },\n\n    $delayTimeLeft: function (value, time, rampType) {\n      this._lDelay.delayTime.set(value, time, rampType);\n    },\n\n    $delayTimeRight: function (value, time, rampType) {\n      this._rDelay.delayTime.set(value, time, rampType);\n    },\n\n    $feedbackLeft: function (value, time, rampType) {\n      this._lFeedback.gain.set(value, time, rampType);\n    },\n\n    $feedbackRight: function (value, time, rampType) {\n      this._rFeedback.gain.set(value, time, rampType);\n    },\n\n    $crosstalk: function (value, time, rampType) {\n      this._lXtalk.gain.set(value, time, rampType);\n      this._rXtalk.gain.set(value, time, rampType);\n    },\n\n    $mix: function (value, time, rampType) {\n      this._dry.gain.set(1.0 - value, time, rampType);\n      this._wet.gain.set(value, time, rampType);\n    }\n\n  };\n\n  // REQUIRED: extending plug-in prototype with modules\n  WX.PlugIn.extendPrototype(StereoDelay, 'Processor');\n\n  // REQUIRED: registering plug-in into WX ecosystem\n  WX.PlugIn.register(StereoDelay);\n\n})(WX);"
  },
  {
    "path": "src/plug_ins/WXS1/wxs1.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n(function (WX) {\n\n  'use strict';\n\n  /**\n   * Implements monophonic subtractive synthsizer.\n   * @type {WAPL}\n   * @param {Object} preset Parameter preset.\n   * @param {Number} preset.osc1type Oscillator 1 waveform type.\n   * @param {Number} preset.osc1octave Oscillator 1 octave.\n   * @param {Number} preset.osc1gain Oscillator 1 gain.\n   * @param {Number} preset.osc2type Oscillator 2 waveform type.\n   * @param {Number} preset.osc2detune Oscillator 2 detune.\n   * @param {Number} preset.osc2gain Oscillator 2 gain.\n   * @param {Number} preset.glide Pitch glide time in seconds.\n   * @param {Number} preset.cutoff LPF cutoff frequency.\n   * @param {Number} preset.reso LPF resonance.\n   * @param {Number} preset.filterMod Filter modulation amount.\n   * @param {Number} preset.filterAttack Filter envelope attack.\n   * @param {Number} preset.filterDecay Filter envelope decay.\n   * @param {Number} preset.filterSustain Filter envelope sustain.\n   * @param {Number} preset.filterRelease Filter envelope release.\n   * @param {Number} preset.ampAttack Amplitude envelope attack.\n   * @param {Number} preset.ampDecay Amplitude envelope decay.\n   * @param {Number} preset.ampSustain Amplitude envelope sustain.\n   * @param {Number} preset.ampRelease Amplitude envelope release.\n   * @param {Number} preset.output Plug-in output gain.\n   */\n  function WXS1(preset) {\n\n    WX.PlugIn.defineType(this, 'Generator');\n\n    this._osc1 = WX.OSC();\n    this._osc2 = WX.OSC();\n    this._osc1gain = WX.Gain();\n    this._osc2gain = WX.Gain();\n    this._lowpass = WX.Filter();\n    this._amp = WX.Gain();\n\n    this._osc1.to(this._osc1gain).to(this._lowpass);\n    this._osc2.to(this._osc2gain).to(this._lowpass);\n    this._lowpass.to(this._amp);\n    this._amp.to(this._output);\n\n    this._osc1.start(0);\n    this._osc2.start(0);\n\n    // close envelope by default\n    this._amp.gain.value = 0.0;\n\n    // for monophonic behaviour\n    this._pitchTimeStamps = {};\n\n    // parameter definition\n    WX.defineParams(this, {\n\n      osc1type: {\n        type: 'Itemized',\n        name: 'Waveform',\n        default: 'square',\n        model: WX.WAVEFORMS\n      },\n\n      osc1octave: {\n        type: 'Generic',\n        name: 'Octave',\n        default: 0,\n        min: -5,\n        max: 5,\n        unit: 'Octave'\n      },\n\n      osc1gain: {\n        type: 'Generic',\n        name: 'Gain',\n        default: 0.5,\n        min: 0.0,\n        max: 1.0,\n        unit: 'LinearGain'\n      },\n\n      osc2type: {\n        type: 'Itemized',\n        name: 'Waveform',\n        default: 'square',\n        model: WX.WAVEFORMS\n      },\n\n      osc2detune: {\n        type: 'Generic',\n        name: 'Semitone',\n        default: 0,\n        min: -60,\n        max: 60,\n        unit: 'Semitone'\n      },\n\n      osc2gain: {\n        type: 'Generic',\n        name: 'Gain',\n        default: 0.5,\n        min: 0.0,\n        max: 1.0,\n        unit: 'LinearGain'\n      },\n\n      glide: {\n        type: 'Generic',\n        name: 'Glide',\n        default: 0.02,\n        min: 0.006,\n        max: 1.0,\n        unit: 'Seconds'\n      },\n\n      cutoff: {\n        type: 'Generic',\n        name: 'Cutoff',\n        default: 1000,\n        min: 20,\n        max: 5000,\n        unit: 'Hertz'\n      },\n\n      reso: {\n        type: 'Generic',\n        name: 'Reso',\n        default: 0.0,\n        min: 0.0,\n        max: 20.0,\n        unit: ''\n      },\n\n      filterMod: {\n        type: 'Generic',\n        name: 'FiltMod',\n        default: 1.0,\n        min: 0.25,\n        max: 8.0,\n        unit: ''\n      },\n\n      filterAttack: {\n        type: 'Generic',\n        name: 'FiltAtt',\n        default: 0.02,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      filterDecay: {\n        type: 'Generic',\n        name: 'FiltDec',\n        default: 0.04,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      filterSustain: {\n        type: 'Generic',\n        name: 'FiltSus',\n        default: 0.25,\n        min: 0.0,\n        max: 1.0\n      },\n\n      filterRelease: {\n        type: 'Generic',\n        name: 'FiltRel',\n        default: 0.2,\n        min: 0.0,\n        max: 10.0,\n        unit: 'Seconds'\n      },\n\n      ampAttack: {\n        type: 'Generic',\n        name: 'Att',\n        default: 0.02,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      ampDecay: {\n        type: 'Generic',\n        name: 'Dec',\n        default: 0.04,\n        min: 0.0,\n        max: 5.0,\n        unit: 'Seconds'\n      },\n\n      ampSustain: {\n        type: 'Generic',\n        name: 'Sus',\n        default: 0.25,\n        min: 0.0,\n        max: 1.0\n      },\n\n      ampRelease: {\n        type: 'Generic',\n        name: 'Rel',\n        default: 0.2,\n        min: 0.0,\n        max: 10.0,\n        unit: 'Seconds'\n      }\n    });\n\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  WXS1.prototype = {\n\n    info: {\n      name: 'WXS1',\n      version: '0.0.3',\n      api_version: '1.0.0-alpha',\n      author: 'Hongchan Choi',\n      type: 'Generator',\n      description: '2 OSC Monophonic Subtractive Synth'\n    },\n\n    defaultPreset: {\n      osc1type: 'square',\n      osc1octave: -1,\n      osc1gain: 0.4,\n      osc2type: 'square',\n      osc2detune: 7.0,\n      osc2gain: 0.4,\n      glide: 0.02,\n      cutoff: 140,\n      reso: 18.0,\n      filterMod: 7,\n      filterAttack: 0.01,\n      filterDecay: 0.07,\n      filterSustain: 0.5,\n      filterRelease: 0.03,\n      ampAttack: 0.01,\n      ampDecay: 0.44,\n      ampSustain: 0.2,\n      ampRelease: 0.06,\n      output: 0.8\n    },\n\n    $osc1type: function (value, time, rampType) {\n      this._osc1.type = value;\n    },\n\n    $osc1octave: function (value, time, rampType) {\n      this._osc1.detune.set(value * 1200, time, rampType);\n    },\n\n    $osc1gain: function (value, time, rampType) {\n      this._osc1gain.gain.set(value, time, rampType);\n    },\n\n    $osc2type: function (value, time, rampType) {\n      this._osc2.type = value;\n    },\n\n    $osc2detune: function (value, time, rampType) {\n      this._osc2.detune.set(value * 100, time, rampType);\n    },\n\n    $osc2gain: function (value, time, rampType) {\n      this._osc2gain.gain.set(value, time, rampType);\n    },\n\n    $cutoff: function (value, time, rampType) {\n      this._lowpass.frequency.set(value, time, rampType);\n    },\n\n    $reso: function (value, time, rampType) {\n      this._lowpass.Q.set(value, time, rampType);\n    },\n\n    // Returns a key index with the most recent pitch in the map. If all keys\n    // are off, returns null.\n    _getCurrentPitch: function () {\n      var latestPitch = null,\n          latestTimeStamp = 0;\n      for (var pitch in this._pitchTimeStamps) {\n        var timeStamp = this._pitchTimeStamps[pitch];\n        if (timeStamp > latestTimeStamp) {\n          latestTimeStamp = timeStamp;\n          latestPitch = pitch;\n        }\n      }\n      return latestPitch;\n    },\n\n    _changePitch: function (pitch, time) {\n      time = (time || WX.now) + this.params.glide.get();\n      var freq = WX.mtof(pitch);\n      this._osc1.frequency.set(freq, time, 1);\n      this._osc2.frequency.set(freq, time, 1);\n    },\n\n    _startEnvelope: function (time) {\n      time = (time || WX.now);\n      var p = this.params,\n          aAtt = p.ampAttack.get(),\n          aDec = p.ampDecay.get(),\n          fAmt = p.filterMod.get() * 1200,\n          fAtt = p.filterAttack.get(),\n          fDec = p.filterDecay.get(),\n          fSus = p.filterSustain.get();\n      // attack\n      this._amp.gain.set(1.0, [time, aAtt], 3);\n      this._lowpass.detune.set(fAmt, [time, fAtt], 3);\n      // decay\n      this._amp.gain.set(fSus, [time + aAtt, aDec], 3);\n      this._lowpass.detune.set(fAmt * fSus, [time + fAtt, fDec], 3);\n    },\n\n    _releaseEnvelope: function (time) {\n      time = (time || WX.now);\n      var p = this.params;\n      // cancel pre-programmed envelope data points\n      this._amp.gain.cancel(time);\n      this._lowpass.detune.cancel(time);\n      // release\n      this._amp.gain.set(0.0, [time, p.ampRelease.get()], 3);\n      this._lowpass.detune.set(0.0, [time, p.filterRelease.get()], 3);\n    },\n\n    onData: function (action, data) {\n      switch (action) {\n        case 'noteon':\n          this._pitchTimeStamps[data.pitch] = data.time;\n          var pitch = this._getCurrentPitch();\n          // The first key will start envelopes.\n          if (Object.keys(this._pitchTimeStamps).length === 1) {\n            this._changePitch(pitch, data.time);\n            this._startEnvelope(data.time);\n          } else {\n            this._changePitch(pitch, data.time);\n          }\n          break;\n        case 'noteoff':\n          if (this._pitchTimeStamps.hasOwnProperty(data.pitch)) {\n            delete this._pitchTimeStamps[data.pitch];\n          }\n          var pitch = this._getCurrentPitch();\n          // There is no key pressed. Release envelope.\n          if (pitch === null) {\n            this._releaseEnvelope(data.time);\n          } else {\n            this._changePitch(pitch, data.time);\n          }\n          break;\n      }\n    }\n  };\n\n  WX.PlugIn.extendPrototype(WXS1, 'Generator');\n  WX.PlugIn.register(WXS1);\n\n})(WX);"
  },
  {
    "path": "src/waax.core.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n//\n// Parameter Abstractions\n//\n\n// parameter types for internal reference\nvar PARAM_TYPES = [\n  'Generic',\n  'Itemized',\n  'Boolean'\n];\n\n// units for paramter\nvar PARAM_UNITS = [\n  '',\n  'Octave',\n  'Semitone',\n  'Seconds',\n  'Milliseconds',\n  'Samples',\n  'Hertz',\n  'Cents',\n  'Decibels',\n  'LinearGain',\n  'Percent',\n  'BPM'\n];\n\n// utility: check if the param arg is numeric\nfunction wxparam_checkNumeric(arg, defaultValue) {\n  if (WX.isNumber(arg)) {\n    return arg;\n  } else if (arg === undefined) {\n    return defaultValue;\n  } else {\n    WX.Log.error('Invalid parameter configuration.');\n  }\n}\n\n// Parameter factory. Creates an instance of paramter class.\nfunction wxparam_create(options) {\n  if (PARAM_TYPES.indexOf(options.type) < 0) {\n    WX.Log.error('Invalid Parameter Type.');\n  }\n  switch (options.type) {\n    case 'Generic':\n      return new GenericParam(options);\n    case 'Itemized':\n      return new ItemizedParam(options);\n    case 'Boolean':\n      return new BooleanParam(options);\n  }\n}\n\n\n/**\n * Generic parameter(numerical and ranged) abstraction. Usually called by\n *   {@link WX.defineParams} method.\n * @name GenericParam\n * @class\n * @param {Object} options Parameter configruation.\n * @param {String} options.name User-defined parameter name.\n * @param {String} options.unit Parameter unit.\n * @param {Number} options.default Default value.\n * @param {Number} options.value Parameter value.\n * @param {Number} options.min Minimum value.\n * @param {Number} options.max Maximum value.\n * @param {Object} options._parent Reference to associated Plug-in.\n */\nfunction GenericParam(options) {\n  this.init(options);\n}\n\nGenericParam.prototype = {\n\n  /**\n   * Initializes instance with options.\n   * @memberOf GenericParam\n   * @param  {Object} options Paramter configuration.\n   */\n  init: function (options) {\n    this.type = 'Generic';\n    this.name = (options.name || 'Parameter');\n    this.unit = (options.unit || '');\n    this.value = this.default = wxparam_checkNumeric(options.default, 0.0);\n    this.min = wxparam_checkNumeric(options.min, 0.0);\n    this.max = wxparam_checkNumeric(options.max, 1.0);\n    // parent, reference to the plug-in\n    this._parent = options._parent;\n    // handler callback\n    this.$callback = options._parent['$' + options._paramId];\n  },\n\n  /**\n   * Sets parameter value with time and ramp type. Calls back\n   *   a corresponding handler.\n   * @memberOf GenericParam\n   * @param {Number} value Parameter target value\n   * @param {Number|Array} time time or array of [start time, time constant]\n   * @param {Number} rampType WAAX ramp type\n   */\n  set: function (value, time, rampType) {\n    // set value in this parameter instance\n    this.value = WX.clamp(value, this.min, this.max);\n    // then call hander if it's defined\n    if (this.$callback) {\n      this.$callback.call(this._parent, this.value, time, rampType);\n    }\n  },\n\n  /**\n   * Returns the paramter value. Note that this is not a computed value\n   *   of WA AudioParam instance.\n   * @memberOf GenericParam\n   * @return {Number} Latest paramter value.\n   */\n  get: function () {\n    return this.value;\n  }\n\n};\n\n/**\n * Itemized parameter abstraction. Usually called by {@link WX.defineParams}\n *   method.\n * @name ItemizedParam\n * @class\n * @param {Object} options Parameter configruation.\n * @param {String} options.name User-defined parameter name.\n * @param {String} options.model Option items.\n * @param {Number} options.default Default item.\n * @param {Number} options.value Current item.\n * @param {Object} options._parent Reference to associated Plug-in.\n */\nfunction ItemizedParam(options) {\n  this.init(options);\n}\n\nItemizedParam.prototype = {\n\n  /**\n   * Initializes instance with options.\n   * @memberOf ItemizedParam\n   * @param  {Object} options Paramter configuration.\n   */\n  init: function (options) {\n    // assertion\n    if (!WX.isArray(options.model)) {\n      Log.error('Model is missing.');\n    }\n    if (!WX.validateModel(options.model)) {\n      Log.error('Invalid Model.');\n    }\n    // initialization\n    this.type = 'Itemized';\n    this.name = (options.name || 'Select');\n    this.model = options.model;\n    this.default = (options.default || this.model[0].value);\n    this.value = this.default;\n    // caching parent\n    this._parent = options._parent;\n    // handler callback assignment\n    this.$callback = options._parent['$' + options._paramId];\n  },\n\n  /**\n   * Sets parameter value with time and ramp type. Calls back\n   *   a corresponding handler.\n   * @memberOf ItemizedParam\n   * @param {Number} value Parameter target value\n   * @param {Number|Array} time time or array of\n   *   <code>[start time, time constant]</code>\n   * @param {Number} rampType WAAX ramp type\n   */\n  set: function (value, time, rampType) {\n    // check if value is valid \n    if (WX.findKeyByValue(this.model, value)) {\n      this.value = value;\n      if (this.$callback) {\n        this.$callback.call(this._parent, this.value, time, rampType);\n      }\n    } else {\n      WX.Log.warn('Invalid value (value not found in model).');\n    }\n  },\n\n  /**\n   * Returns the paramter value. Note that this is not a computed value\n   *   of WA AudioParam instance.\n   * @memberOf ItemizedParam\n   * @return {Number} Latest paramter value.\n   */\n  get: function () {\n    return this.value;\n  },\n\n  /**\n   * Returns the reference of items (WAAX model).\n   * @memberOf ItemizedParam\n   * @return {Array} WAAX model associated with the parameter.\n   */\n  getModel: function () {\n    return this.model;\n  }\n\n};\n\n/**\n * Boolean parameter abstraction. Usually called by {@link WX.defineParams}\n *   method.\n * @name BooleanParam\n * @class\n * @param {Object} options Parameter configruation.\n * @param {String} options.name User-defined parameter name.\n * @param {Number} options.default Default value.\n * @param {Number} options.value Current value.\n * @param {Object} options._parent Reference to associated Plug-in.\n */\nfunction BooleanParam(options) {\n  this.init(options);\n}\n\nBooleanParam.prototype = {\n\n  /**\n   * Initializes instance with options.\n   * @memberOf BooleanParam\n   * @param {Object} options Paramter configuration.\n   */\n  init: function (options) {\n    if (!WX.isBoolean(options.default)) {\n      Log.error('Invalid value for Boolean Parameter.');\n    }\n    this.type = 'Boolean';\n    this.name = (options.name || 'Toggle');\n    this.value = this.default = options.default;\n    this._parent = options._parent;\n    // handler callback assignment\n    this.$callback = options._parent['$' + options._paramId];\n  },\n\n  /**\n   * Sets parameter value with time and ramp type. Calls back\n   *   a corresponding handler.\n   * @memberOf BooleanParam\n   * @param {Number} value Parameter target value\n   * @param {Number|Array} time time or array of\n   *   <code>[start time, time constant]</code>\n   * @param {Number} rampType WAAX ramp type\n   */\n  set: function (value, time, rampType) {\n    if (WX.isBoolean(value)) {\n      this.value = value;\n      if (this.$callback) {\n        this.$callback.call(this._parent, this.value, time, rampType);\n      }\n    }\n  },\n\n  /**\n   * Returns the paramter value. Note that this is not a computed value\n   *   of WA AudioParam instance.\n   * @memberOf BooleanParam\n   * @return {Number} Latest paramter value.\n   */\n  get: function () {\n    return this.value;\n  }\n\n};\n\n/**\n * Defines parameters by specified options.\n * @memberOf WX\n * @param {Object} plugin WAAX Plug-in\n * @param {Object} paramOptions A collection of parameter option objects\n *   . See {@link GenericParam}, {@link ItemizedParam} and\n *   {@link BooleanParam} for available parameter options.\n * @example\n * WX.defineParams(this, {\n *   oscFreq: {\n *     type: 'Generic',\n *     name: 'Freq',\n *     default: WX.mtof(60),\n *     min: 20.0,\n *     max: 5000.0,\n *     unit: 'Hertz'\n *   },\n *   ...\n * };\n */\nWX.defineParams = function (plugin, paramOptions) {\n  for (var key in paramOptions) {\n    paramOptions[key]._parent = plugin;\n    paramOptions[key]._paramId = key;\n    plugin.params[key] = wxparam_create(paramOptions[key]);\n  }\n};\n\n\n/**\n * Create an envelope generator function for WA audioParam.\n * @param {...Array} array Data points of\n *   <code>[value, offset time, ramp type]<code>\n * @returns {Function} Envelope generator function.\n *   <code>function(start time, scale factor)</code>\n * @example\n * // build an envelope generator with relative data points\n * var env = WX.Envelope([0.0, 0.0], [0.8, 0.01, 1], [0.0, 0.3, 2]);\n * // changes gain with an envelope starts at 2.0 sec with 1.2\n *   amplification.\n * synth.set('gain', env(2.0, 1.2));\n */\nWX.Envelope = function () {\n  var args = arguments;\n  return function (startTime, amplifier) {\n    var env = [];\n    startTime = (startTime || 0);\n    amplifier = (amplifier || 1.0);\n    for (var i = 0; i < args.length; i++) {\n      var val = args[i][0], time;\n      // when time argument is array, branch to setTargetAtValue\n      if (WX.isArray(args[i][1])) {\n        time = [startTime + args[i][1][0], startTime + args[i][1][1]];\n        env.push([val * amplifier, time, 3]);\n      }\n      // otherwise use step, linear or exponential ramp\n      else {\n        time = startTime + args[i][1];\n        env.push([val * amplifier, time, (args[i][2] || 0)]);\n      }\n    }\n    return env;\n  };\n};\n\n\n//\n// Plug-in Abstractions\n//\n\n// plug-in types\nvar PLUGIN_TYPES = [\n  'Generator',\n  'Processor',\n  'Analyzer'\n];\n\n// registered plug-ins\nvar registered = {\n  Generator: [],\n  Processor: [],\n  Analyzer: []\n};\n\n/**\n * Plug-In base class.\n * @name PlugInAbstract\n * @class\n */\nfunction PlugInAbstract () {\n  this.params = {};\n}\n\nPlugInAbstract.prototype = {\n\n  /**\n   * Connects a plug-in output to the other plug-in's input or a WA node.\n   *   Note that this does not support multiple outgoing connection.\n   *   (fanning-out)\n   * @memberOf PlugInAbstract\n   * @param {WAPL|AudioNode} target WAPL(Web Audio Plug-In)\n   *   compatible plug-in or WA node.\n   * @returns {WAPL|AudioNode}\n   */\n  to: function (target) {\n    // when the target is a plug-in with inlet.\n    if (target._inlet) {\n      this._outlet.to(target._inlet);\n      return target;\n    }\n    // or it might simply be a WA node.\n    else {\n      try {\n        this._outlet.to(target);\n        return target;\n      } catch (error) {\n        WX.Log.error('Connection failed. Invalid patching.');\n      }\n    }\n  },\n\n  /**\n   * Disconnects all outgoing connections fomr plug-in.\n   * @memberOf PlugInAbstract\n   */\n  cut: function () {\n    this._outlet.cut();\n  },\n\n  /**\n   * Sets a plug-in parameter. Supports dynamic parameter assignment.\n   * @memberOf PlugInAbstract\n   * @param {String} param Parameter name.\n   * @param {Array|Number} arg An array of data points or a single value.\n   * @return {WAPL} Self-reference for method chaining.\n   * @example\n   * // setting parameter with an array\n   * myeffect.set('gain', [[0.0], [1.0, 0.01, 1], [0.0, 0.5, 2]]);\n   * // setting parameter with a value (immediate change)\n   * myeffect.set('gain', 0.0);\n   */\n  set: function (param, arg) {\n    if (WX.hasParam(this, param)) {\n      // check if arg is a value or array\n      if (WX.isArray(arg)) {\n        // if env is an array, iterate envelope data\n        // where array is arg_i = [value, time, rampType]\n        for (var i = 0; i < arg.length; i++) {\n          this.params[param].set.apply(this, arg[i]);\n        }\n      } else {\n        // otherwise change the value immediately\n        this.params[param].set(arg, WX.now, 0);\n      }\n    }\n    return this;\n  },\n\n  /**\n   * Gets a paramter value.\n   * @memberOf PlugInAbstract\n   * @param {String} param Parameter name.\n   * @return {*} Paramter value. Returns null when a paramter not found.\n   */\n  get: function (param) {\n    if (WX.hasParam(this, param)) {\n      return this.params[param].get();\n    } else {\n      return null;\n    }\n  },\n\n  /**\n   * Sets plug-in preset, which is a collection of parameters. Note that\n   *   setting a preset changes all the associated parameters immediatley.\n   * @memberOf PlugInAbstract\n   * @param {Object} preset A collection of paramters.\n   */\n  setPreset: function (preset) {\n    for (var param in preset) {\n      this.params[param].set(preset[param], WX.now, 0);\n    }\n  },\n\n  /**\n   * Gets a current plug-in paramters as a collection. Note that the\n   *   collection is created on the fly. It is a clone of current parameter\n   *   values.\n   * @memberOf PlugInAbstract\n   * @return {Object} Preset.\n   */\n  getPreset: function () {\n    var preset = {};\n    for (var param in this.params) {\n      preset[param] = this.params[param].get();\n    }\n    return preset;\n  }\n\n};\n\n\n/**\n * Generator plug-in class. No audio inlet.\n * @name Generator\n * @class\n * @extends PlugInAbstract\n * @param {Object} params\n * @param {Number} params.output Plug-in output gain.\n */\nfunction Generator() {\n\n  // extends PlugInAbstract\n  PlugInAbstract.call(this);\n\n  // creating essential WA nodes\n  this._output = WX.Gain();\n  this._outlet = WX.Gain();\n  // and patching\n  this._output.to(this._outlet);\n\n  // paramter definition\n  WX.defineParams(this, {\n\n    output: {\n      type: 'Generic',\n      name: 'Output',\n      default: 1.0,\n      min: 0.0,\n      max: 1.0,\n      unit: 'LinearGain'\n    }\n\n  });\n\n}\n\nGenerator.prototype = {\n\n  /**\n   * Parameter handler for <code>params.output</code>\n   * @memberOf Generator\n   * @private\n   */\n  $output: function (value, time, rampType) {\n    this._output.gain.set(value, time, rampType);\n  }\n\n};\n\n// extends prototype with PlugInAbstract\nWX.extend(Generator.prototype, PlugInAbstract.prototype);\n\n\n/**\n * Processor plug-in class. Features both inlet and outlet.\n * @name Processor\n * @class\n * @extends PlugInAbstract\n * @param {Object} params\n * @param {Generic} params.input Input gain.\n * @param {Generic} params.output Output gain.\n * @param {Boolean} params.bypass Bypass switch.\n */\nfunction Processor() {\n\n  // extends PlugInAbstract\n  PlugInAbstract.call(this);\n\n  // WA nodes\n  this._inlet = WX.Gain();\n  this._input = WX.Gain();\n  this._output = WX.Gain();\n  this._active = WX.Gain();\n  this._bypass = WX.Gain();\n  this._outlet = WX.Gain();\n  // patching\n  this._inlet.to(this._input, this._bypass);\n  this._output.to(this._active).to(this._outlet);\n  this._bypass.to(this._outlet);\n\n  // initialization for bypass\n  this._active.gain.value = 1.0;\n  this._bypass.gain.value = 0.0;\n\n  WX.defineParams(this, {\n\n    input: {\n      type: 'Generic',\n      name: 'Input',\n      default: 1.0,\n      min: 0.0,\n      max: 1.0,\n      unit: 'LinearGain'\n    },\n\n    output: {\n      type: 'Generic',\n      name: 'Output',\n      default: 1.0,\n      min: 0.0,\n      max: 1.0,\n      unit: 'LinearGain'\n    },\n\n    bypass: {\n      type: 'Boolean',\n      name: 'Bypass',\n      default: false\n    }\n\n  });\n\n}\n\nProcessor.prototype = {\n\n  /**\n   * Parameter handler for <code>params.input</code>\n   * @memberOf Processor\n   * @private\n   */\n  $input: function (value, time, rampType) {\n    this._input.gain.set(value, time, rampType);\n  },\n\n  /**\n   * Parameter handler for <code>params.output</code>\n   * @memberOf Processor\n   * @private\n   */\n  $output: function (value, time, rampType) {\n    this._output.gain.set(value, time, rampType);\n  },\n\n  /**\n   * Parameter handler for <code>params.bypass</code>\n   * @memberOf Processor\n   * @private\n   */\n  $bypass: function(value, time, rampType) {\n    time = (time || WX.now);\n    if (value) {\n      this._active.gain.set(0.0, time, 0);\n      this._bypass.gain.set(1.0, time, 0);\n    } else {\n      this._active.gain.set(1.0, time, 0);\n      this._bypass.gain.set(0.0, time, 0);\n    }\n  }\n\n};\n\n// extends PlugInAbstract\nWX.extend(Processor.prototype, Generator.prototype);\n\n\n/**\n * Analyzer plug-in class. Features both inlet, outlet and analyzer.\n * @name Analyzer\n * @class\n * @extends PlugInAbstract\n * @param {Object} params\n * @param {Generic} params.input Input gain.\n */\nfunction Analyzer() {\n\n  PlugInAbstract.call(this);\n\n  this._inlet = WX.Gain();\n  this._input = WX.Gain();\n  this._analyzer = WX.Analyzer();\n  this._outlet = WX.Gain();\n\n  this._inlet.to(this._input).to(this._analyzer);\n  this._inlet.to(this._outlet);\n\n  WX.defineParams(this, {\n\n    input: {\n      type: 'Generic',\n      name: 'Input',\n      default: 1.0,\n      min: 0.0,\n      max: 1.0,\n      unit: 'LinearGain'\n    }\n\n  });\n\n}\n\nAnalyzer.prototype = {\n\n  /**\n   * Parameter handler for <code>params.input</code>\n   * @private\n   * @memberOf Analyzer\n   */\n  $input: function (value, time, xtype) {\n    this._input.gain.set(value, time, xtype);\n  }\n\n};\n\n// extends PlugInAbstract\nWX.extend(Analyzer.prototype, PlugInAbstract.prototype);\n\n\n//\n// Plug-in utilities\n//\n\n/**\n * @namespace WX.PlugIn\n */\nWX.PlugIn = {};\n\n/**\n * Defines type of a plug-in. Required in plug-in definition.\n * @param {WAPL} plugin Target plug-in.\n * @param {String} type Plug-in type. <code>['Generator', 'Processor',\n *   'Analyzer']</code>\n */\nWX.PlugIn.defineType = function (plugin, type) {\n  // check: length should be less than 3\n  if (PLUGIN_TYPES.indexOf(type) < 0) {\n    WX.Log.error('Invalid Plug-in type.');\n  }\n  // branch on plug-in type\n  switch (type) {\n    case 'Generator':\n      Generator.call(plugin);\n      break;\n    case 'Processor':\n      Processor.call(plugin);\n      break;\n    case 'Analyzer':\n      Analyzer.call(plugin);\n      break;\n  }\n};\n\n/**\n * Initializes plug-in preset. Merges default preset with user-defined\n *   preset. Required in plug-in definition.\n * @param {WAPL} plugin Target plug-in.\n * @param {Object} preset Preset.\n */\nWX.PlugIn.initPreset = function (plugin, preset) {\n  var merged = WX.clone(plugin.defaultPreset);\n  WX.extend(merged, preset);\n  plugin.setPreset(merged);\n};\n\n/**\n * Extends plug-in prototype according to the type. Required in plug-in\n *   definition.\n * @param {WAPL} plugin Target plug-in.\n * @param {String} type Plug-in type. <code>['Generator', 'Processor',\n *   'Analyzer']</code>\n */\nWX.PlugIn.extendPrototype = function (plugin, type) {\n  // check: length should be less than 3\n  if (PLUGIN_TYPES.indexOf(type) < 0) {\n    WX.Log.error('Invalid Plug-in type.');\n  }\n  // branch on plug-in type\n  switch (type) {\n    case 'Generator':\n      WX.extend(plugin.prototype, Generator.prototype);\n      break;\n    case 'Processor':\n      WX.extend(plugin.prototype, Processor.prototype);\n      break;\n    case 'Analyzer':\n      WX.extend(plugin.prototype, Analyzer.prototype);\n      break;\n  }\n};\n\n/**\n * Registers the plug-in prototype to WX namespace. Required in plug-in\n *   definition.\n * @param {Function} PlugInClass Class reference (function name) of\n *   plug-in.\n */\nWX.PlugIn.register = function (PlugInClass) {\n  var info = PlugInClass.prototype.info;\n  // hard check version info\n  if (WX.getVersion() < info.api_version) {\n    // FATAL: PlugInClass is incompatible with WX Core.\n    WX.Log.error(PlugInClass.name, ': FATAL. incompatible WAAX version.');\n  }\n  // register PlugInClass in WX namespace\n  registered[info.type].push(PlugInClass.name);\n  WX[PlugInClass.name] = function (preset) {\n    return new PlugInClass(preset);\n  };\n};\n\n/**\n * Returns a list of regsitered plug-ins of a certain type.\n * @param {String} type Plug-in Type.\n * @return {Array} A list of plug-ins.\n */\nWX.PlugIn.getRegistered = function (type) {\n  var plugins = null;\n  if (PLUGIN_TYPES.indexOf(type) > -1) {\n    switch (type) {\n      case undefined:\n        plugins = registered.Generator.slice(0);\n        plugins = plugins.concat(registered.Processor.slice(0));\n        plugins = plugins.concat(registered.Analyzer.slice(0));\n        break;\n      case 'Generator':\n        plugins = registered.Generator.slice(0);\n        break;\n      case 'Processor':\n        plugins = registered.Processor.slice(0);\n        break;\n      case 'Analyzer':\n        plugins = registered.Analyzer.slice(0);\n        break;\n    }\n  }\n  return plugins;\n};\n\n// WAAX is ready to serve!\nWX.Log.info('WAAX', WX.getVersion(), '(' + WX.srate + 'Hz)');"
  },
  {
    "path": "src/waax.extension.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n/**\n * Injects into window.AudioNode\n * @namespace AudioNode\n */\n\n/**\n * Connects a WA node to the other WA nodes. Note that this method is\n *   injected to AudioNode.prototype. Supports multiple outgoing\n *   connections. (fanning out) Returns the first WA node to enable method\n *   chaining.\n * @memberOf AudioNode\n * @param {...AudioNode} nodes WA nodes.\n * @return {AudioNode} The first target WA node.\n */\nAudioNode.prototype.to = function () {\n  for (var i = 0; i < arguments.length; i++) {\n    this.connect(arguments[i]);\n  }\n  return arguments[0];\n};\n\n/**\n * Disconnects outgoing connection of a WA node. Note that this method is\n *   injected to AudioNode.prototype.\n * @memberOf AudioNode\n */\nAudioNode.prototype.cut = function () {\n  this.disconnect();\n};\n\n/**\n * Injects into window.AudioParam\n * @namespace AudioParam\n */\n\n/**\n * Equivalent of AudioParam.cancelScheduledValues. Cancels scheduled value\n *   after a given starting time.\n * @memberOf AudioParam\n * @method\n * @see  http://www.w3.org/TR/webaudio/#dfn-cancelScheduledValues\n */\nAudioParam.prototype.cancel = AudioParam.prototype.cancelScheduledValues;\n\n/**\n * Manipulates AudioParam dynamically.\n * @memberOf AudioParam\n * @param {Number} value Target parameter value\n * @param {Number|Array} time Automation start time. With rampType 3, this\n *   argument must be an array specifying [start time, time constant].\n * @param {Number} rampType Automation ramp type. 0 = step, 1 = linear,\n *   2 = exponential, 3 = target value [start, time constant].\n * @see  http://www.w3.org/TR/webaudio/#methodsandparams-AudioParam-section\n */\nAudioParam.prototype.set = function (value, time, rampType) {\n  var now = WX.now;\n  switch (rampType) {\n    case 0:\n    case undefined:\n      time = (time < now) ? now : time;\n      this.setValueAtTime(value, time);\n      // TO FIX: when node is not connected, automation will not work\n      // this hack handles the error\n      if (time <= now && value !== this.value) {\n        this.value = value;\n      }\n      break;\n    case 1:\n      time = (time < now) ? now : time;\n      this.linearRampToValueAtTime(value, time);\n      break;\n    case 2:\n      time = (time < now) ? now : time;\n      value = value <= 0.0 ? 0.00001 : value;\n      this.exponentialRampToValueAtTime(value, time);\n      break;\n    case 3:\n      time[0] = (time[0] < now) ? now : time[0];\n      value = value <= 0.0 ? 0.00001 : value;\n      this.setTargetAtTime(value, time[0], time[1]);\n      break;\n  }\n};\n\n// ECMA Script 5 getter for current time and srate.\nObject.defineProperties(WX, {\n\n  /**\n   * Returns current audio context time. (ECMA Script 5 Getter)\n   * @memberOf WX\n   * @return {Number} Current audio context time in seconds.\n   */\n  now: {\n    get: function () {\n      return WX._ctx.currentTime;\n    }\n  },\n\n  /**\n   * Returns current audio device sample rate. (ECMA Script 5 Getter)\n   * @memberOf WX\n   * @return {Number} Current sample rate.\n   */\n  srate: {\n    get: function () {\n      return WX._ctx.sampleRate;\n    },\n  }\n});\n\n/**\n * Creates an instance of WA Gain node.\n * @return {AudioNode} WA Gain node.\n * @see  http://www.w3.org/TR/webaudio/#GainNode\n */\nWX.Gain = function() {\n  return WX._ctx.createGain();\n};\n\n/**\n * Creates an instance of WA Oscillator node.\n * @return {AudioNode} WA Oscillator node.\n * @see  http://www.w3.org/TR/webaudio/#OscillatorNode\n */\nWX.OSC = function() {\n  return WX._ctx.createOscillator();\n};\n\n/**\n * Creates an instance of WA Delay node.\n * @return {AudioNode} WA Delay node.\n * @see  http://www.w3.org/TR/webaudio/#DelayNode\n */\nWX.Delay = function() {\n  return WX._ctx.createDelay();\n};\n\n/**\n * Creates an instance of WA BiquadFilter node.\n * @return {AudioNode} WA BiquadFilter node.\n * @see  http://www.w3.org/TR/webaudio/#BiquadFilterNode\n */\nWX.Filter = function() {\n  return WX._ctx.createBiquadFilter();\n};\n\n/**\n * Creates an instance of WA DynamicCompressor node.\n * @return {AudioNode} WA DynamicsCompressor node.\n * @see  http://www.w3.org/TR/webaudio/#DynamicsCompressorNode\n */\nWX.Comp = function() {\n  return WX._ctx.createDynamicsCompressor();\n};\n\n/**\n * Creates an instance of WA Convolver node.\n * @return {AudioNode} WA Convolver node.\n * @see  http://www.w3.org/TR/webaudio/#ConvolverNode\n */\nWX.Convolver = function() {\n  return WX._ctx.createConvolver();\n};\n\n/**\n * Creates an instance of WA WaveShaper node.\n * @return {AudioNode} WA WaveShaper node.\n * @see  http://www.w3.org/TR/webaudio/#WaveShaperNode\n */\nWX.WaveShaper = function() {\n  return WX._ctx.createWaveShaper();\n};\n\n/**\n * Creates an instance of WA BufferSource node.\n * @return {AudioNode} WA BufferSource node.\n * @see  http://www.w3.org/TR/webaudio/#BufferSourceNode\n */\nWX.Source = function() {\n  return WX._ctx.createBufferSource();\n};\n\n/**\n * Creates an instance of WA Analyzer node.\n * @return {AudioNode} WA Analyzer node.\n * @see  http://www.w3.org/TR/webaudio/#AnalyzerNode\n */\nWX.Analyzer = function() {\n  return WX._ctx.createAnalyser();\n};\n\n/**\n * Creates an instance of WA Panner node.\n * @return {AudioNode} WA Panner node.\n * @see  http://www.w3.org/TR/webaudio/#PannerNode\n */\nWX.Panner = function() {\n  return WX._ctx.createPanner();\n};\n\n/**\n * Creates an instance of WA PerodicWave object.\n * @return {AudioNode} WA PeriodicWave object.\n * @see  http://www.w3.org/TR/webaudio/#PeriodicWave\n */\nWX.PeriodicWave = function () {\n  return WX._ctx.createPeriodicWave.apply(WX._ctx, arguments);\n};\n\n/**\n * Creates an instance of WA Splitter node.\n * @return {AudioNode} WA Splitter node.\n * @see  http://www.w3.org/TR/webaudio/#SplitterNode\n */\nWX.Splitter = function () {\n  return WX._ctx.createChannelSplitter.apply(WX._ctx, arguments);\n};\n\n/**\n * Creates an instance of WA Merger node.\n * @return {AudioNode} WA Merger node.\n * @see  http://www.w3.org/TR/webaudio/#MergerNode\n */\nWX.Merger = function () {\n  return WX._ctx.createChannelMerger.apply(WX._ctx, arguments);\n};\n\n/**\n * Creates an instance of WA Buffer object.\n * @return {AudioNode} WA Buffer object.\n * @see  http://www.w3.org/TR/webaudio/#Buffer\n */\nWX.Buffer = function () {\n  return WX._ctx.createBuffer.apply(WX._ctx, arguments);\n};\n\nWX.WAVEFORMS = [\n  { key: 'Sine', value: 'sine' },\n  { key: 'Square', value: 'square' },\n  { key: 'Sawtooth', value: 'sawtooth' },\n  { key: 'Triangle', value: 'triangle' }\n];\n\nWX.FILTER_TYPES = [\n  { key:'LP' , value: 'lowpass' },\n  { key:'HP' , value: 'highpass' },\n  { key:'BP' , value: 'bandpass' },\n  { key:'LS' , value: 'lowshelf' },\n  { key:'HS' , value: 'highshelf' },\n  { key:'PK' , value: 'peaking' },\n  { key:'BR' , value: 'notch' },\n  { key:'AP' , value: 'allpass' }\n];"
  },
  {
    "path": "src/waax.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n/**\n * @namespace WX\n */\nwindow.WX = {\n  _VERSION: '1.0.0-alpha3'\n};\n\n// Monkey patching and feature detection.\nvar _webkitAC = window.hasOwnProperty('webkitAudioContext');\nvar _AC = window.hasOwnProperty('AudioContext');\n\nif (!_webkitAC && !_AC) {\n  throw new Error('Error: Web Audio API is not supported on your browser.');\n} else {\n  if (_webkitAC && !_AC) {\n    window.AudioContext = window.webkitAudioContext;\n  }\n}\n\n// Create AudioContext.\nWX._ctx = new AudioContext();\n\n// Checking the minimum dependency.\nvar _dependency = [\n  // 'createStereoPanner',\n];\n\nfor (var i = 0; i < _dependency.length; i++) {\n  if (typeof WX._ctx[_dependency[i]] === 'undefined') {\n    var message = 'Error: \"' + _dependency + '\" is not supported in AudioContext.';\n    throw new Error(message);\n  }\n}\n\n/**\n * @typedef WAPL\n * @description Web Audio API Plug-in Object.\n * @type {Object}\n */\n\n/**\n * @typedef WXModel\n * @description Contains a model for data binding.\n * @type {Array}\n * @example\n * var model = [\n *   { key:'Sine', value:'sine' },\n *   { key:'Sawtooth', value:'sawtooth' }\n *   ...\n * ];\n */\n\n/**\n * @typedef WXClip\n * @description WAAX abstraction of sample and meta data.\n * @type {Object}\n * @property {String} name User-defined name of sample.\n * @property {String} url URL of audio file.\n * @property {Object} buffer A placeholder for ArrayBuffer object.\n * @example\n * var clip = {\n *   name: 'Cool Sample',\n *   url: 'http://mystaticdata.com/samples/coolsample.wav',\n *   buffer: null\n * };\n */\n\n/**\n * @typedef WXSampleZone\n * @description WAAX abstraction of sampler instrument data.\n * @type {Object}\n * @property {WXClip} clip WXClip object.\n * @property {Number} basePitch Original sample pitch.\n * @property {Boolean} loop Looping flag.\n * @property {Number} loopStart Loop start point in seconds.\n * @property {Number} loopEnd Loop end point in seconds.\n * @property {Number} pitchLow Low pitch bound.\n * @property {Number} pitchHigh High pitch bound.\n * @property {Number} velocityLow Low velocity bound.\n * @property {Number} velocityHigh High velocity bound.\n * @property {Boolean} pitchModulation Switch for pitch sensitivity modulation.\n * @property {Boolean} velocityModulatio Switch for velocity sensitivity modulation.\n * @example\n * var sampleZone = {\n *   clip: WXClip\n *   basePitch: 60            // samples original pitch\n *   loop: true,\n *   loopStart: 0.1,\n *   loopEnd: 0.5,\n *   pitchLow: 12,            // pitch low bound\n *   pitchHigh: 96,           // pitch high bound\n *   velocityLow: 12,         // velocity lower bound\n *   velocityHigh: 127,       // velocity high bound\n *   pitchModulation: true,   // use pitch modulation\n *   velocityModulatio: true  // use velocity moduation\n * };\n */"
  },
  {
    "path": "src/waax.timebase.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n/**\n * @typedef MBST\n * @description Measure, beat, sixteenth, tick aka musical timebase.\n * @type {Object}\n * @property {Number} measure Measure.\n * @property {Number} beat Beat.\n * @property {Number} sixteenth Sixteenth.\n * @property {Number} tick Tick.\n */\n\n// MBT - measure, beat, sixteenth, tick aka musical timebase.\n// Tick - atomic unit for musical timebase.\n// Second - unit for linear timebase.\nvar _TICKS_PER_BEAT = 480,\n    _TICKS_PER_MEASURE = _TICKS_PER_BEAT * 4,\n    _TICKS_PER_SIXTEENTH = _TICKS_PER_BEAT * 0.25;\n\n// internal: unique ID for notes/events (4 bytes uid generator)\n// see: http://stackoverflow.com/a/8809472/4155261\nfunction generate_uid4(){\n  var t = Date.now();\n  var id = 'xxxx'.replace(/[x]/g, function(c) {\n    var r = (t + Math.random() * 16) % 16 | 0;\n    t = Math.floor(t / 16);\n    return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);\n  });\n  return id;\n}\n\n/**\n * Note abstraction. Instantiated by {@link WX.Note}.\n * @name Note\n * @class\n * @param {Number} pitch MIDI pitch.\n * @param {Number} velocity MIDI velocity.\n * @param {Number} start Start time in tick.\n * @param {Number} duration Note durtion in tick.\n */\nfunction Note(pitch, velocity, start, duration) {\n  this.pitch = (pitch || 60);\n  this.velocity = (velocity || 100);\n  this.start = (start || 0);\n  this.duration = (duration || 120);\n}\n\nNote.prototype = {\n\n  /**\n   * Changes note duration by delta.\n   * @memberOf Note\n   * @param  {Number} delta Duration.\n   */\n  changeDuration: function (delta) {\n    this.duration += ~~(delta);\n    this.duration = Math.max(this.duration, 1);\n  },\n\n  /**\n   * Returns the note end time in tick.\n   * @memberOf Note\n   * @return {Number}\n   */\n  getEnd: function () {\n    return this.start + this.duration;\n  },\n\n  /**\n   * Sets note properties from a note.\n   * @memberOf Note\n   * @param {Note} note\n   */\n  setNote: function (note) {\n    for (var prop in note) {\n      this[prop] = note[prop];\n    }\n  },\n\n  /**\n   * Moves note pitch by delta.\n   * @memberOf Note\n   * @param  {Number} delta Pitch displacement.\n   */\n  translatePitch: function (delta) {\n    this.pitch += ~~(delta);\n    this.pitch = WX.clamp(this.pitch, 0, 127);\n  },\n\n  /**\n   * Moves note pitch by delta.\n   * @memberOf Note\n   * @param  {Number} delta Pitch displacement.\n   */\n  translateStart: function (delta) {\n    this.start += ~~(delta);\n    this.start = Math.max(this.start, 0);\n  },\n\n  /**\n   * Returns current properties in a string.\n   * @memberOf Note\n   * @return {String}\n   */\n  toString: function () {\n    return this.pitch + ',' + this.velocity + ',' +\n      this.start + ',' + this.duration;\n  },\n\n  /**\n   * Returns start time for numeric operation.\n   * @memberOf Note\n   * @return {Number}\n   */\n  valueOf: function () {\n    return this.start;\n  }\n\n};\n\n\n/**\n * NoteClip abstraction. A collection of Note objects. Instantiated by \n *   WX.NoteClip.\n * @name NoteClip\n * @class\n */\nfunction NoteClip() {\n  this._init();\n}\n\nNoteClip.prototype = {\n\n  // Initializes or resets note clip.\n  _init: function () {\n    this.notes = {};\n    this.start = 0;\n    this.end = 0;\n    this.size = 0;\n  },\n\n  /**\n   * Deletes and returns a note from clip. Returns null when not found.\n   * @memberOf NoteClip\n   * @param  {String} id Note ID.\n   * @return {Note | null}\n   */\n  delete: function (id) {\n    if (this.notes.hasOwnProperty(id)) {\n      var note = this.notes[id];\n      delete this.notes[id];\n      this.size--;\n      return note;\n    }\n    return null;\n  },\n\n  /**\n   * Flush out noteclip content.\n   * @memberOf NoteClip\n   */\n  empty: function () {\n    this.notes = {};\n    this.size = 0;\n  },\n\n  /**\n   * Find a note that contains a point specified by pitch and tick. Then\n   *   returns note ID. Returns null when not found.\n   *   Note that this impl might produce an undesirable result since it\n   *   simply catches the first note detected in the iteration. There is no\n   *   perfect solution over this problem, so I chose to make it robust\n   *   instead.\n   * @memberOf NoteClip\n   * @param  {Number} pitch MIDI pitch\n   * @param  {Number} tick Position in tick.\n   * @return {String | null}\n   */\n  findNoteIdAtPosition: function (pitch, tick) {\n    for (var id in this.notes) {\n      var note = this.notes[id];\n      if (note && note.pitch === pitch) {\n        if (note.start <= tick && tick <= note.getEnd()) {\n          return id;\n        }\n      }\n    }\n    return null;\n  },\n\n  /**\n   * Find notes in a area specified by pitch and tick. Then returns an array\n   *   of notes. Returns null when nothing in target area.\n   *   Note that this method only care for start time of note. If a note\n   *   starts before than the area, it will not be included in the selection.\n   * @memberOf NoteClip\n   * @param  {Number} minPitch Lower bound pitch.\n   * @param  {Number} maxPitch Upper bound pitch.\n   * @param  {Number} startTick Start time in tick.\n   * @param  {Number} endTick End time in tick.\n   * @return {Array | null}\n   */\n  findNotesIdInArea: function (minPitch, maxPitch, startTick, endTick) {\n    var bucket = [];\n    for (var id in this.notes) {\n      var note = this.notes[id];\n      if (note) {\n        if (minPitch <= note.pitch && note.pitch <= maxPitch) {\n          if (startTick <= note.start && note.start <= endTick) {\n            bucket.push(id);\n          }\n        }\n      }\n    }\n    return (bucket.length > 0) ? bucket : null;\n  },\n\n  /**\n   * Returns note from clip with id.\n   * @memberOf NoteClip\n   * @param  {String} id Note ID.\n   * @return {Object}\n   */\n  get: function (id) {\n    if (this.hasId(id)) {\n      return this.notes[id];\n    }\n    return null;\n  },\n\n  /**\n   * Retunrs an array with all the ID of notes.\n   * @memberOf NoteClip\n   * @return {Array}\n   */\n  getAllId: function () {\n    return Object.keys(this.notes);\n  },\n\n  /**\n   * Returns clip size.\n   * @memberOf NoteClip\n   * @return {Number}\n   */\n  getSize: function () {\n    return this.size;\n  },\n\n  /**\n   * Probes clip with note id.\n   * @memberOf NoteClip\n   * @param  {String} id Note id.\n   * @return {Boolean} True if clip contains the note.\n   */\n  hasId: function (id) {\n    return this.notes.hasOwnProperty(id);\n  },\n\n  /**\n   * Iterates all the notes with callback function.\n   * @memberOf NoteClip\n   * @param  {callback_noteclip_iterate} callback Process for iteration.\n   */\n  iterate: function (callback) {\n    var index = 0;\n    for (var id in this.notes) {\n      callback(id, this.notes[id], index++);\n    }\n  },\n\n  /**\n   * Callback for note clip interation. Called by NoteClip.iterate.\n   * @callback callback_noteclip_iterate\n   * @param {String} id Note ID.\n   * @param {Note} Note object.\n   * @param {Number} index Iteration index.\n   * @see NoteClip.iterate\n   */\n\n  /**\n   * Pushes a new note into clip. Returns ID of the new note.\n   * @memberOf NoteClip\n   * @param  {Note} note\n   * @return {String} Note ID.\n   */\n  push: function (note) {\n    var id;\n    do {\n      id = generate_uid4();\n    } while (this.hasId(id));\n    this.notes[id] = note;\n    this.size++;\n    return id;\n  },\n\n  /**\n   * Set a note with a specific ID. If the same ID found, update properties\n   *   of the note. Otherwise, create a new note with a specified ID. Usually\n   *   this method is used in the collaborative context.\n   * @memberOf NoteClip\n   * @param {String} id Note ID.\n   * @param {Note} note Note object.\n   */\n  set: function (id, note) {\n    if (this.hasId(id)) {\n      this.notes[id].setNote(note);\n    } else {\n      this.notes[id] = note;\n    }\n  },\n\n  /**\n   * Returns an array of notes within a timespan. Returns null when not found.\n   *   Note that this method actually returns Note objects, not IDs.\n   * @memberOf NoteClip\n   * @param  {Number} start Start time in tick.\n   * @param  {Number} end End time in tick.\n   * @return {Array | null}\n   */\n  scanNotesInTimeSpan: function (start, end) {\n    var bucket = [];\n    for (var id in this.notes) {\n      var note = this.notes[id];\n      if (note) {\n        if (start <= note.start && note.start <= end) {\n          bucket.push(note);\n        }\n      }\n    }\n    return (bucket.length > 0) ? bucket : null;\n  }\n};\n\n\n//\n// Router class should be here.\n//\n\n\n// NOTES:\n// absolute time: time in audioContext\n// sec: linear time in seconds\n// tick: musical time, atomic unit of MBT timebase (varies on BPM)\n// * if not specified in method signature, it is handled as tick\n//   all the internal calculation should be in seconds\n\n/**\n * Transport abstraction. Singleton and instantiated by default.\n * @name Transport\n * @class\n * @param {Number} BPM Beat per minute.\n */\nfunction Transport(BPM) {\n  this._init(BPM || 120);\n}\n\nTransport.prototype = {\n  // TEMPORARY\n  _flushPlaybackQueue: function () {\n    this._playbackQueue.length = 0;\n  },\n\n  // Sets current playhead position by seconds (audioContext).\n  _setPlayheadPosition: function (second) {\n    this._now = second;\n    this._absOrigin = WX.now - this._now;\n  },\n\n  // Scans notes in current scan range.\n  _scheduleNotesInScanRange: function () {\n    if (this._needsScan) {\n      var notes = null;\n      if (this._source) {\n        notes = this._source.scanNotesInTimeSpan(\n          this.sec2tick(this._scanStart),\n          this.sec2tick(this._scanEnd)\n        );\n      }\n      // push notes into playbackQueue\n      if (notes) {\n        for (var i = 0; i < notes.length; i++) {\n          if (this._playbackQueue.indexOf(notes[i]) < 0) {\n            this._playbackQueue.push(notes[i]);\n          }\n        }\n      }\n      this._needsScan = false;\n    }\n    // send queued notes to target plug-ins\n    if (this._playbackQueue.length > 0) {\n      for (var i = 0; i < this._playbackQueue.length; i++) {\n        var note = this._playbackQueue[i],\n            start = this._absOrigin + this.tick2sec(note.start),\n            end = start + this.tick2sec(note.dur);\n        // schedule notes by onData method\n        // this.targets[0].onData('noteon', {\n        //   pitch: note.pitch,\n        //   velocity: note.velocity,\n        //   time: start\n        // });\n        // this.targets[0].onData('noteoff', {\n        //   pitch: note.pitch,\n        //   velocity: 0,\n        //   time :end\n        // });\n      }\n    }\n  },\n\n  // Move the scan range of scan forward by runner.\n  _advanceScanRange: function () {\n    // Advances the scan range to the next block, if the scan end point is\n    // close enough (< 16.7ms) to playhead.\n    if (this._scanEnd - this._now < 0.0167) {\n      this._scanStart = this._scanEnd;\n      this._scanEnd = this._scanStart + this._lookAhead;\n      this._needsScan = true;\n    }\n  },\n\n  // Reset the scan range based on current playhead position.\n  _resetScanRange: function () {\n    this._scanStart = this._now;\n    this._scanEnd =  this._scanStart + this._lookahead;\n    this._needsScan = true;\n  },\n\n  // Update assigned transport MUI element. update data:\n  // MBST format of now_t, loopEnd, loopStart, BPM\n  _updateView: function () {\n\n  },\n\n  // Runs the transport (update every 16.7ms)\n  _run: function () {\n    // console.log(this._now);\n    if (this._RUNNING) {\n      // add time elapsed to now_t by checking now_ac\n      var absNow = WX.now;\n      this._now += (absNow - this._absLastNow);\n      this._absLastNow = absNow;\n      // scan notes in range\n      this._scheduleNotesInScanRange();\n      // advance when transport is running\n      this._advanceScanRange();\n      // update transport view\n      this._updateView();\n      // flush played notes\n      this._flushPlaybackQueue();\n      // check loop flag\n      if (this._LOOP) {\n        if (this._loopEnd - (this._now + this._lookAhead) < 0) {\n          this._setPlayheadPosition(this._loopStart - (this._loopEnd - this._now));\n        }\n      }\n\n      // TODO\n      // Transport should have a router (note clips > in-out > plug-in)\n      // 0. iterate through the router entries\n      // 1. note clip entry in router -> get target plug-in\n      // 2. scan note clips\n      // 3. send data to plug-in\n      //\n      // if there is any registered plug-in for metronome\n      // schedule metronome as well\n\n      // TODO: pulse metronome\n      // if (this.USE_METRONOME && this.metronome) {\n      //   // if nextPulse is in lookahead range, schedule it\n      //   this.metronome.play(this.now, this.lookahead);\n      // }\n\n      // ORIGINAL CODE:\n      // var tick = mtime2tick(this.nextClick);\n      // if (this.getLinearTime(tick) < this.ltime_now + this.lookahead) {\n      //   var accent = (this.nextClick.beat % 4 === 0) ? true : false;\n      //   this.metronome.play(this.getAbsoluteTime(tick), accent);\n      //   this.nextClick.beat += 1;\n      // }\n      \n    }\n    // schedule next step\n    requestAnimationFrame(this._run.bind(this));\n  },\n\n  // initializing transport with BPM\n  _init: function (BPM) {\n    // origin in absolute time and 'now' reference\n    this._BPM = BPM;\n    this._lastBPM = BPM;\n\n    // beats/ticks in seconds\n    this._BIS = 0.0;\n    this._TIS = 0.0;\n\n    // origin by audio context time\n    // it is '0' position of playhead in linear time\n    this._absOrigin = 0.0;\n    this._absLastNow = 0.0;\n\n    // now, loop, lookAhead by transport time\n    this._now = 0.0;\n    this._loopStart = 0.0;\n    this._loopEnd = 0.0;\n    this._lookAhead = 0.0;\n\n    // playback scan range and dirty flag\n    this._scanStart = 0.0;\n    this._scanEnd = this._lookAhead;\n    this._needsScan = true;\n\n    // transport view element\n    this._transportView = null;\n\n    // TEMPORARY\n    this._playbackQueue = [];\n    this._source = null; // noteclip\n    this._target = null; // plug-in\n\n    // switches\n    this._RUNNING = false;\n    this._LOOP = false;\n    this._USE_METRONOME = false;\n\n    // set BPM and initiate runner\n    this.setBPM(BPM);\n    this._run();\n  },\n\n\n  // Transport Public Methods\n  //\n  // NOTE: the max integer in JavaScript is 9007199254740992.\n  // With this number as ticks, the maximum offset of a note is\n  // { measure: 1145324612, beat: 1, sixteenth: 0, tick: 32 }\n  // It is about 38177487 minutes in BPM of 120. (~636291 hours, ~26512 days)\n  // So, this number is good enough to cover general music making.\n  //\n  // Having separated notation like { measure, beat, sixteenth, tick } is\n  // not really necessary. It is easy to translate both way when it's needed.\n  // (i.e. displaying timing data on UI.)\n\n  /**\n   * Converts tick to second based on transport tempo.\n   * @memberOf Transport\n   * @param  {Number} tick Tick (atomic musical time unit)\n   * @return {Number}\n   */\n  tick2sec: function (tick) {\n    return tick * this._TIS;\n  },\n\n  /**\n   * Converts second to tick based on transport tempo.\n   * @memberOf Transport\n   * @param  {Number} sec Second\n   * @return {Number}\n   */\n  sec2tick: function (sec) {\n    return sec / this._TIS;\n  },\n\n  /**\n   * Starts playback.\n   * @memberOf Transport\n   */\n  start: function () {\n    // Arrange time references.\n    var absNow = WX.now;\n    this._absOrigin = absNow - this._now;\n    this._absLastNow = absNow;\n    // Reset scan range.\n    this._resetScanRange();\n    // Transport is running.\n    this._RUNNING = true;\n  },\n\n  /**\n   * Pauses current playback.\n   * @memberOf Transport\n   */\n  pause: function () {\n    this._RUNNING = false;\n    this._flushPlaybackQueue();\n  },\n\n  /**\n   * Sets playhead position by tick.\n   * @memberOf Transport\n   * @param {Number} tick Playhead position in ticks.\n   */\n  setNow: function (tick) {\n    this._setPlayheadPosition(this.tick2sec(tick));\n    this._resetScanRange();\n  },\n\n  /**\n   * Returns playhead position by tick.\n   * @memberOf Transport\n   * @return {Number}\n   */\n  getNow: function () {\n    return this.sec2tick(this._now);\n  },\n\n  /**\n   * Rewinds playhead to the beginning.\n   * @memberOf Transport\n   */\n  rewind: function () {\n    this._setPlayheadPosition(0.0);\n  },\n\n  /**\n   * Sets loop start position by tick.\n   * @memberOf Transport\n   * @param {Number} tick Loop start in tick.\n   */\n  setLoopStart: function (tick) {\n    this._loopStart = this.tick2sec(tick);\n  },\n\n  /**\n   * Sets loop end position by tick.\n   * @memberOf Transport\n   * @param {Number} tick Loop end in tick.\n   */\n  setLoopEnd: function (tick) {\n    this._loopEnd = this.tick2sec(tick);\n  },\n\n  /**\n   * Returns loop start by tick.\n   * @memberOf Transport\n   * @return {Number}\n   */\n  getLoopStart: function () {\n    return this.sec2tick(this._loopStart);\n  },\n\n  /**\n   * Returns loop end by tick.\n   * @memberOf Transport\n   * @return {Number}\n   */\n  getLoopEnd: function () {\n    return this.sec2tick(this._loopEnd);\n  },\n\n  /**\n   * Toggles or sets loop status.\n   * @memberOf Transport\n   * @param  {Boolean|undefined} bool Loop state. If undefined, it toggles the current state.\n   */\n  toggleLoop: function (bool) {\n    if (bool === undefined) {\n      this._LOOP = !this._LOOP;\n    } else {\n      if (WX.isBoolean(bool)) {\n        this._LOOP = bool;\n      } else {\n        WX.Log.error('Invalid parameter. Use boolean value.');\n      }\n    }\n  },\n\n  /**\n   * Sets transport BPM.\n   * @memberOf Transport\n   * @param {Number} BPM Beat per minute.\n   */\n  setBPM: function (BPM) {\n    // calculates change factor\n    this._BPM = (BPM || 120);\n    var factor = this._lastBPM / this._BPM;\n    this._lastBPM = this._BPM;\n    // recalcualte beat in seconds, tick in seconds\n    this._BIS = 60.0 / this._BPM;\n    this._TIS = this._BIS / _TICKS_PER_BEAT;\n    // lookahead is 16 ticks (1/128th note)\n    this._lookAhead = this._TIS * 16;\n    // update time references based on tempo change\n    this._now *= factor;\n    this._loopStart *= factor;\n    this._loopEnd *= factor;\n    this._absOrigin = WX.now - this._now;\n  },\n\n  /**\n   * Returns current BPM.\n   * @memberOf Transport\n   * @return {Number}\n   */\n  getBPM: function () {\n    return this._BPM;\n  },\n\n  /**\n   * Returns current running status of transport.\n   * @memberOf Transport\n   * @return {Boolean}\n   */\n  isRunning: function () {\n    return this._RUNNING;\n  }\n\n};\n\n/**\n * Converts MBST(measure, beat, sixteenth, tick) format to tick.\n * @memberOf WX\n * @param  {MBST} Musical time in MBST format.\n * @return {Number} Musical time in tick.\n */\nWX.mbst2tick = function (mtime) {\n  return (mtime.measure || 0) * _TICKS_PER_MEASURE +\n    (mtime.beat || 0) * _TICKS_PER_BEAT +\n    (mtime.sixteenth || 0) * _TICKS_PER_SIXTEENTH +\n    (mtime.tick || 0);\n};\n\n/**\n * Converts tick to MBST(measure, beat, sixteenth, tick) format.\n * @memberOf WX\n * @param  {Number} tick Tick.\n * @return {MBST} Musical time in MBST format.\n */\nWX.tick2mbst = function (tick) {\n  return {\n    measure: ~~(tick / _TICKS_PER_MEASURE),\n    beat: ~~((tick % _TICKS_PER_MEASURE) / _TICKS_PER_BEAT),\n    sixteenth: ~~((tick % _TICKS_PER_BEAT) / _TICKS_PER_SIXTEENTH),\n    tick: ~~(tick % _TICKS_PER_SIXTEENTH)\n  };\n};\n\n/**\n * Creates a Note instance.\n * @memberOf WX\n * @param  {Number} pitch MIDI pitch (0~127)\n * @param  {Number} velocity MIDI velocity (0~127)\n * @param  {Number} start Note start time in tick.\n * @param  {Number} duration Note durtion in tick.\n * @return {Note}\n */\nWX.Note = function (pitch, velocity, start, duration) {\n  return new Note(pitch, velocity, start, duration);\n};\n\n/**\n * Create a NoteClip instance.\n * @memberOf WX\n * @return {NoteClip}\n */\nWX.NoteClip = function () {\n  return new NoteClip();\n};\n\n/**\n * Singleton instance of Transporter.\n * @type {Transport}\n */\nWX.Transport = new Transport(120);"
  },
  {
    "path": "src/waax.util.js",
    "content": "// Copyright 2011-2014 Hongchan Choi. All rights reserved.\n// Use of this source code is governed by MIT license that can be found in the\n// LICENSE file.\n\n/**\n * Features system-wide logging utilities.\n * @namespace WX.Log\n */\nWX.Log = {\n  // log level. (1: info, 2: warn, 3: error)\n  _LEVEL: 1\n};\n\n/**\n * Sets logging level.\n * @param {Number} level logging level { 1: info, 2: warn, 3: error }\n */\nWX.Log.setLevel = function (level) {\n  this._LEVEL = level;\n};\n\n/**\n * Prints an informative message on console.\n * @param {...String} message messages to be printed\n */\nWX.Log.info = function () {\n  if (this._LEVEL > 1) return;\n  var args = Array.prototype.slice.call(arguments);\n  args.unshift('[WX:info]');\n  window.console.log.apply(window.console, args);\n};\n\n/**\n * Prints a warning message on console.\n * @param {...String} message messages to be printed.\n */\nWX.Log.warn = function () {\n  if (this._LEVEL > 2) return;\n  var args = Array.prototype.slice.call(arguments);\n  args.unshift('[WX:warn]');\n  window.console.log.apply(window.console, args);\n};\n\n/**\n * Prints an error message on console and throws an error.\n * @param {...String} message messages to be printed.\n */\nWX.Log.error = function () {\n  var args = Array.prototype.slice.call(arguments);\n  args.unshift('[WX:error]');\n  window.console.log.apply(window.console, args);\n  throw new Error('[WX:error]');\n};\n\n/**\n * Returns WAAX API version number. (semantic version)\n * @returns {Number} WAAX API version number\n * @see http://semver.org/\n */\nWX.getVersion = function () {\n  return this._VERSION;\n};\n\n// Object manipulation and music math.\n// : Features utilities for object manipulation, music math and more.\n//   Note that all utility methods are under WX namespace.\n// References\n// : http://underscorejs.org/docs/underscore.html\n// : https://github.com/libpd/libpd/blob/master/pure-data/src/x_acoustics.c\n\n/**\n * Checks if an argument is a JS object.\n * @returns {Boolean}\n */\nWX.isObject = function (obj) {\n  return obj === Object(obj);\n};\n\n/**\n * Checks if an argument is a JS function.\n * @returns {Boolean}\n */\nWX.isFunction = function (fn) {\n  return toString.call(fn) === '[object Function]';\n};\n\n/**\n * Checks if an argument is a JS array.\n * @returns {Boolean}\n */\nWX.isArray = function (arr) {\n  return toString.call(arr) === '[object Array]';\n};\n\n/**\n * Checks if the type of an argument is Number.\n * @returns {Boolean}\n */\nWX.isNumber = function (num) {\n  return toString.call(num) === '[object Number]';\n};\n\n/**\n * Checks if the type of an argument is Boolean.\n * @returns {Boolean}\n */\nWX.isBoolean = function (bool) {\n  return toString.call(bool) === '[object Boolean]';\n};\n\n/**\n * Checks if a WAAX plug-in has a parameter\n * @param {String} param Parameter name\n * @returns {Boolean}\n */\nWX.hasParam = function(plugin, param) {\n  return hasOwnProperty.call(plugin.params, param);\n};\n\n/**\n * Extends target object with the source object. If two objects have\n *   duplicates, properties in target object will be overwritten.\n * @param  {Object} target Object to be extended\n * @param  {Object} source Object to be injected\n * @returns {Object} A merged object.\n */\nWX.extend = function (target, source) {\n  for (var prop in source) {\n    target[prop] = source[prop];\n  }\n  return target;\n};\n\n/**\n * Retunrs a clone of JS object. This returns shallow copy.\n * @param  {Object} source Object to be cloned\n * @returns {Object} Cloned object\n */\nWX.clone = function (source) {\n  var obj = {};\n  for (var prop in source) {\n    obj[prop] = source[prop];\n  }\n  return obj;\n};\n\n/**\n * Validates a WAAX model. This verifies if all the keys in the\n * model is unique. WAAX model is a collection of key-value pairs\n * that is useful for data binding or templating.\n * @param  {Array} model WAAX model\n * @returns {Boolean}\n * @example\n * // Example WAAX model for waveform types\n * var model = [\n *   { key:'Sine', value:'sine' },\n *   { key:'Sawtooth', value:'sawtooth' }\n *   ...\n * ];\n */\nWX.validateModel = function (model) {\n  if (model.length === 0) {\n    return false;\n  }\n  var keys = [];\n  for (var i = 0; i < model.length; i++) {\n    if (keys.indexOf(model[i].key) > -1) {\n      return false;\n    } else {\n      keys.push(model[i].key);\n    }\n  }\n  return true;\n};\n\n/**\n * Finds a key from a model by a value.\n * @param  {Array} model WAAX model\n * @param  {*} value Value in model\n * @returns {String|null} Key or null when not found.\n * @see {@link WX.Model} for WAAX model specification.\n */\nWX.findKeyByValue = function (model, value) {\n  for (var i = 0; i < model.length; i++) {\n    if (model[i].value === value) {\n      return model[i].key;\n    }\n  }\n  return null;\n};\n\n/**\n * Finds a value from a model by a key.\n * @param  {Array} model WAAX model\n * @param  {String} key Key in model\n * @returns {*|null} Value or null when not found.\n * @see {@link WX.validateModel} for WAAX model specification.\n */\nWX.findValueByKey = function (model, key) {\n  for (var i = 0; i < model.length; i++) {\n    if (model[i].key === key) {\n      return model[i].value;\n    }\n  }\n  return null;\n};\n\n/**\n * Clamps a number into a range specified by min and max.\n * @param  {Number} value Value to be clamped\n * @param  {Number} min   Range minimum\n * @param  {Number} max   Range maximum\n * @return {Number}       Clamped value\n */\nWX.clamp = function (value, min, max) {\n  return Math.min(Math.max(value, min), max);\n};\n\n/**\n * Generates a floating point random number between min and max.\n * @param  {Number} min Range minimum\n * @param  {Number} max Range maximum\n * @return {Number}     A floating point random number\n */\nWX.random2f = function (min, max) {\n  return min + Math.random() * (max - min);\n};\n\n/**\n * Generates an integer random number between min and max.\n * @param  {Number} min Range minimum\n * @param  {Number} max Range maximum\n * @return {Number}     An integer random number\n */\nWX.random2 = function (min, max) {\n  return Math.round(min + Math.random() * (max - min));\n};\n\n/**\n * Converts a MIDI pitch number to frequency.\n * @param  {Number} midi MIDI pitch (0 ~ 127)\n * @return {Number}      Frequency (Hz)\n */\nWX.mtof = function (midi) {\n  if (midi <= -1500) return 0;\n  else if (midi > 1499) return 3.282417553401589e+38;\n  else return 440.0 * Math.pow(2, (Math.floor(midi) - 69) / 12.0);\n};\n\n/**\n * Converts frequency to MIDI pitch.\n * @param  {Number} freq Frequency\n * @return {Number}      MIDI pitch\n */\nWX.ftom = function (freq) {\n  return Math.floor(\n    freq > 0 ?\n    Math.log(freq/440.0) / Math.LN2 * 12 + 69 : -1500\n  );\n};\n\n/**\n * Converts power to decibel. Note that it is off by 100dB to make it\n *   easy to use MIDI velocity to change volume. This is the same\n *   convention that PureData uses. This behaviour might change in the\n *   future.\n * @param  {Number} power Power\n * @return {Number}       Decibel\n */\nWX.powtodb = function (power) {\n  if (power <= 0) return 0;\n  else {\n    var db = 100 + 10.0 / Math.LN10 * Math.log(power);\n    return db < 0 ? 0 : db;\n  }\n};\n\n/**\n * Converts decibel to power. Note that it is off by 100dB to make it\n *   easy to use MIDI velocity to change volume. This is the same\n *   convention that PureData uses. This behaviour might change in the\n *   future.\n * @param  {Number} db Decibel\n * @return {Number}    Power\n */\nWX.dbtopow = function (db) {\n  if (db <= 0) return 0;\n  else {\n    // TODO: what is 870?\n    if (db > 870) db = 870;\n    return Math.exp(Math.LN10 * 0.1 * (db - 100.0));\n  }\n};\n\n/**\n * Converts RMS(root-mean-square) to decibel.\n * @param  {Number} rms RMS value\n * @return {Number}     Decibel\n */\nWX.rmstodb = function (rms) {\n  if (rms <= 0) return 0;\n  else {\n    var db = 100 + 20.0 / Math.LN10 * Math.log(rms);\n    return db < 0 ? 0 : db;\n  }\n};\n\n/**\n * Converts decibel to RMS(root-mean-square).\n * @param  {Number} db  Decibel\n * @return {Number}     RMS value\n */\nWX.dbtorms = function (db) {\n  if (db <= 0) return 0;\n  else {\n    // TO FIX: what is 485?\n    if (db > 485) db = 485;\n    return Math.exp(Math.LN10 * 0.05 * (db - 100.0));\n  }\n};\n\n/**\n * Converts linear amplitude to decibel.\n * @param  {Number} lin Linear amplitude\n * @return {Number}     Decibel\n */\nWX.lintodb = function (lin) {\n  // if below -100dB, set to -100dB to prevent taking log of zero\n  return 20.0 * (lin > 0.00001 ? (Math.log(lin) / Math.LN10) : -5.0);\n};\n\n/**\n * Converts decibel to linear amplitude. Useful for dBFS conversion.\n * @param  {Number} db  Decibel\n * @return {Number}     Linear amplitude\n */\nWX.dbtolin = function (db) {\n  return Math.pow(10.0, db / 20.0);\n};\n\n/**\n * Converts MIDI velocity to linear amplitude.\n * @param  {Number} velocity MIDI velocity\n * @return {Number}     Linear amplitude\n */\nWX.veltoamp = function (velocity) {\n  // TODO: velocity curve here?\n  return velocity / 127;\n};\n\n/**\n * Loads WAAX clip by XHR loading\n * @param  {Object} clip WAAX Clip\n * @param  {callback_loadClip_oncomplete} oncomplete Function called when\n *   completed.\n * @param  {callback_loadClip_onprogress} onprogress <i>Optional.</i>\n *   Callback for progress report.\n * @example\n * // Creates a WAAX clip on the fly.\n * var clip = {\n *   name: 'Cool Sample',\n *   url: 'http://mystaticdata.com/samples/coolsample.wav',\n *   buffer: null\n * };\n * // Loads the clip and assign the buffer to a sampler plug-in.\n * WX.loadClip(clip, function (clip) {\n *   mySampler.setBuffer(clip.buffer);\n * });\n */\nWX.loadClip = function (clip, oncomplete, onprogress) {\n  if (!oncomplete) {\n    WX.Log.error('Specify `oncomplete` action.');\n    return;\n  }\n  var xhr = new XMLHttpRequest();\n  xhr.open('GET', clip.url, true);\n  xhr.responseType = 'arraybuffer';\n  xhr.onprogress = function (event) {\n    if (onprogress) {\n      onprogress(event, clip);\n    }\n  };\n  xhr.onload = function (event) {\n    try {\n      WX._ctx.decodeAudioData(\n        xhr.response,\n        function (buffer) {\n          clip.buffer = buffer;\n          oncomplete(clip);\n        }\n      );\n    } catch (error) {\n      WX.Log.error('Loading clip failed. (XHR failure)', error.message, clip.url);\n    }\n  };\n  xhr.send();\n};\n\n/**\n * Callback for clip loading completion. Called by {@link WX.loadClip}.\n * @callback callback_loadclip_oncomplete\n * @param {Object} clip WAAX clip\n * @see WX.loadClip\n */\n\n/**\n * Callback for clip loading progress report. called by {@link WX.loadClip}.\n * @callback callback_loadclip_onprogress\n * @param {Object} event XHR progress event object\n * @param {Object} clip WAAX clip\n * @see WX.loadClip\n * @see https://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html\n */"
  },
  {
    "path": "test/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Test Suite | WAAX</title>\n  <link rel=\"stylesheet\" media=\"all\" href=\"../node_modules/mocha/mocha.css\">\n</head>\n\n<body>\n\n  <!-- doms -->\n  <div id=\"mocha\">\n    <h1>WX <small>: Web Audio API eXtension</small></h1>\n    <h2 id=\"client-ver\"></h2>\n    <h2 id=\"waax-ver\"></h2>\n  </div>\n  <div id=\"messages\"></div>\n  <div id=\"fixtures\"></div>\n\n  <!-- mocha + chai -->\n  <script src=\"../node_modules/mocha/mocha.js\"></script>\n  <script src=\"../node_modules/chai/chai.js\"></script>\n\n  <!-- waax -->\n  <script src=\"../build/waax.min.js\"></script>\n\n  <!-- run the code -->\n  <script>mocha.setup('bdd')</script>\n  <script src=\"test-setup.js\"></script>\n  <script src=\"test-core.js\"></script>\n  <script src=\"test-timebase.js\"></script>\n  <script>mocha.run();</script>\n\n  <!-- ga analytics -->\n  <script>\n    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n    ga('create', 'UA-7423687-10', 'auto');\n    ga('send', 'pageview');\n  </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "test/test-core.js",
    "content": "// test-core.js\n\n// caching\nvar expect = chai.expect,\n    should = chai.should();\n\n// Utilities\ndescribe('Core: Utilities - object, music math and more.', function() {\n  describe('getVersion()', function () {\n    it('should return API version number.', function () {\n      expect(WX.getVersion()).to.equal('1.0.0-alpha3');\n    });\n  });\n  describe('Log.info(arg)', function () {\n    it('should print info message in the console.', function (done) {\n      WX.Log.info('this is', 'info', 'message.');\n      done();\n    });\n  });\n  describe('Log.warn(arg)', function () {\n    it('should print warning message in the console.', function (done) {\n      WX.Log.warn('this is', 'warning', 'message.');\n      done();\n    });\n  });\n  describe('Log.error(arg)', function () {\n    it('should print message and throw error.', function () {\n      expect(function () {\n        WX.Log.error('this is', 'error', 'message.');\n      }).to.throw(Error);\n    });\n  });\n  describe('isObject(arg)', function () {\n    it('should return true when input is JS object.', function () {\n      expect(WX.isObject({})).to.equal(true);\n      expect(WX.isObject([])).to.equal(true);\n      expect(WX.isObject('Hey')).to.equal(false);\n      expect(WX.isObject(1.0)).to.equal(false);\n    });\n  });\n  describe('isArray(arg)', function () {\n    it('should return true when input is Array.', function () {\n      expect(WX.isArray([])).to.equal(true);\n      expect(WX.isArray({})).to.equal(false);\n      expect(WX.isArray(1.0)).to.equal(false);\n    });\n  });\n  describe('isNumber(arg)', function () {\n    it('should return true when input is Number.', function () {\n      expect(WX.isNumber(1.0)).to.equal(true);\n      expect(WX.isNumber('Number')).to.equal(false);\n      expect(WX.isNumber({})).to.equal(false);\n    });\n  });\n  describe('isBoolean(arg)', function () {\n    it('should return true when input is Boolean.', function () {\n      expect(WX.isBoolean(true)).to.equal(true);\n      expect(WX.isBoolean(false)).to.equal(true);\n      expect(WX.isBoolean(1)).to.equal(false);\n    });\n  });\n  describe('hasParam(plugin, param)', function () {\n    it('should return true when plugin has the parameter.', function () {\n      var plugin = { params: { 'parameter': 0.0 } };\n      expect(WX.hasParam(plugin, 'parameter')).to.equal(true);\n      expect(WX.hasParam(plugin, 'notParameter')).to.equal(false);\n    });\n  });\n  describe('extend(target, source)', function () {\n    it('should add source to target object and return the extended target.',\n      function () {\n        var source = { a: 1, b: 2 },\n            target = { b: 3, c: 4 },\n            result = { a: 1, b: 2, c: 4 };\n        expect(WX.extend(target, source)).deep.equal(result);\n      }\n    );\n  });\n  describe('clone(source)', function () {\n    it('should return a cloned object.', function () {\n      var source = { a: 1, b: 2 },\n          result = { a: 1, b: 2 };\n      expect(WX.clone(source)).deep.equal(result);\n    });\n  });\n  describe('validateModel(model)', function () {\n    it('returns true when all the keys are unique in a model.', function () {\n      var valid = [\n        { key:'Sine', value:'sine' },\n        { key:'Sinusoid', value:'sine' }\n      ];\n      var invalid = [\n        { key:'Sine', value:'sine' },\n        { key:'Sine', value:'sinusoid' }\n      ];\n      expect(WX.validateModel(valid)).to.equal(true);\n      expect(WX.validateModel(invalid)).to.equal(false);\n    });\n  });\n  describe('findKeyByValue(model, value)', function () {\n    it('returns a key assodicated with a value. null when not found.',\n      function () {\n        var model = [\n          { key:'Sine', value:'sine' },\n          { key:'Sinusoid', value:'sine' }\n        ];\n        expect(WX.findKeyByValue(model, 'sine')).to.equal('Sine');\n        expect(WX.findKeyByValue(model, 'sinusoid')).to.equal(null);\n      }\n    );\n  });\n  describe('findValueByKey(model, key)', function () {\n    it('returns a key assodicated with a value. null when not found.',\n      function () {\n        var model = [\n          { key:'Sine', value:'sine' },\n          { key:'Sine', value:'sinusoid' }\n        ];\n        expect(WX.findValueByKey(model, 'Sine')).to.equal('sine');\n        expect(WX.findValueByKey(model, 'Sawtooth')).to.equal(null);\n      }\n    );\n  });\n  describe('clamp(value, min, max)', function () {\n    it('should clamp value into between min and max.', function () {\n      expect(WX.clamp(1.5, 0.0, 1.0)).to.equal(1.0);\n      expect(WX.clamp(-0.5, 0.0, 1.0)).to.equal(0.0);\n    });\n  });\n  describe('random2f(min, max)', function () {\n    it('should generate a floating point random value between min and max.',\n      function () {\n        var rnd = WX.random2f(0.0, 10.0);\n        expect(rnd).to.be.within(0.0, 10.0);\n        expect(parseInt(rnd, 10) === rnd).to.equal(false);\n      }\n    );\n  });\n  describe('random2(min, max)', function () {\n    it('should generate an integer random value between min and max.',\n      function () {\n        var rnd = WX.random2(0, 10);\n        expect(rnd).to.be.within(0, 10);\n        expect(parseInt(rnd, 10) === rnd).to.equal(true);\n      }\n    );\n  });\n  describe('mtof(midi)', function () {\n    it('should return frequency from MIDI pitch.', function () {\n      expect(WX.mtof(69)).to.equal(440.0);\n      expect(WX.mtof(-1500)).to.equal(0);\n      expect(WX.mtof(1500)).to.equal(3.282417553401589e+38);\n    });\n  });\n  describe('ftom(freq)', function () {\n    it('should return MIDI pitch from frequency.', function () {\n      expect(WX.ftom(440)).to.equal(69);\n      expect(WX.ftom(-1)).to.equal(-1500);\n      expect(WX.ftom(22050)).to.equal(136);\n    });\n  });\n  describe('powtodb(power)', function () {\n    it('should return decibel from signal power.', function () {\n      expect(WX.powtodb(1.0)).to.equal(100.0);\n      expect(WX.powtodb(10.0)).to.equal(110.0);\n    });\n  });\n  describe('dbtopow(db)', function () {\n    it('should return power from decibel.', function () {\n      expect(WX.dbtopow(0.0)).to.equal(0.0);\n      expect(WX.dbtopow(100.0)).to.equal(1.0);\n    });\n  });\n  describe('rmstodb(rms)', function () {\n    it('should return decibel from RMS.', function () {\n      expect(WX.rmstodb(0.0)).to.equal(0.0);\n      expect(WX.rmstodb(100.0)).to.equal(140.0);\n    });\n  });\n  describe('dbtorms(db)', function () {\n    it('should return RMS from decibel.', function () {\n      expect(WX.dbtorms(0.0)).to.equal(0.0);\n      expect(WX.dbtorms(100.0)).to.equal(1.0);\n    });\n  });\n  describe('veltoamp(vel)', function () {\n    it('should return linear amp from velocity.', function () {\n      expect(WX.veltoamp(0)).to.equal(0);\n      expect(WX.veltoamp(63)).to.equal(0.49606299212598426);\n      expect(WX.veltoamp(64)).to.equal(0.5039370078740157);\n      expect(WX.veltoamp(127)).to.equal(1.0);\n    });\n  });\n\n});\n\n// Core: Audio System\ndescribe('Core: Audio System', function() {\n\n  describe('context', function () {\n    it('should be AudioContext.', function () {\n      expect(typeof WX._ctx.createGain).to.equal('function');\n    });\n  });\n  // TODO: there might be inconsistent between now and currentTime. be advise.\n  describe('now (getter)', function () {\n    it('should return current time in audio context.', function () {\n      expect(WX.now).to.be.at.least(0.0);\n      expect(WX.now).to.equal(WX._ctx.currentTime);\n    });\n  });\n  describe('srate (getter)', function () {\n    it('should return current sample rate of audio context.', function () {\n      expect(WX.srate).to.be.above(22050);\n      expect(WX.srate).to.equal(WX._ctx.sampleRate);\n    });\n  });\n  describe('Gain()', function () {\n    it('should return a gain node.', function () {\n      expect(WX.Gain()).to.have.property('gain');\n    });\n  });\n  describe('OSC()', function () {\n    it('should return an oscillator node.', function () {\n      expect(WX.OSC()).to.have.property('frequency');\n    });\n  });\n  describe('Delay()', function () {\n    it('should return a delay node.', function () {\n      expect(WX.Delay()).to.have.property('delayTime');\n    });\n  });\n  describe('Filter()', function () {\n    it('should return a biquad filter node.', function () {\n      expect(WX.Filter()).to.have.property('frequency');\n    });\n  });\n  describe('Comp()', function () {\n    it('should return a compressor node.', function () {\n      expect(WX.Comp()).to.have.property('threshold');\n    });\n  });\n  describe('Convolver()', function () {\n    it('should return a convolver node.', function () {\n      expect(WX.Convolver()).to.have.property('buffer');\n    });\n  });\n  describe('WaveShaper()', function () {\n    it('should return a waveshaper node.', function () {\n      expect(WX.WaveShaper()).to.have.property('curve');\n    });\n  });\n  describe('Source()', function () {\n    it('should return a audio buffer source node.', function () {\n      expect(WX.Source()).to.have.property('buffer');\n    });\n  });\n  describe('Analyzer()', function () {\n    it('should return an analyzer node.', function () {\n      expect(WX.Analyzer()).to.have.property('fftSize');\n    });\n  });\n  describe('Panner()', function () {\n    it('should return a panner node.', function () {\n      expect(WX.Panner()).to.have.property('panningModel');\n    });\n  });\n  describe('PeriodicWave()', function () {\n    it('should return a periodic wave object.', function () {\n      var mag = new Float32Array(256),\n          phase = new Float32Array(256),\n          wave = WX.PeriodicWave(mag, phase);\n      expect(typeof wave).to.equal('object');\n    });\n  });\n  describe('Splitter()', function () {\n    it('should return a channel splitter node.', function () {\n      var splitter = WX.Splitter();\n      expect(splitter.numberOfOutputs).to.equal(6);\n    });\n  });\n  describe('Merger()', function () {\n    it('should return a channel merger node.', function () {\n      var merger = WX.Merger();\n      expect(merger.numberOfInputs).to.equal(6);\n    });\n  });\n  describe('Buffer()', function () {\n    it('should return a buffer source.', function () {\n      expect(WX.Buffer(2, 1.0, 44100).length).to.equal(1);\n      expect(WX.Buffer(1, 2.0, 48000).length).to.equal(2);\n    });\n  });\n  describe('Envelope(arg)', function () {\n    it('should return an envelope generator.', function () {\n      var env = WX.Envelope([0.0, 0.0], [0.8, 0.01, 1], [0.0, 0.3, 2]);\n      var t = WX.now;\n      expect(env(1.0, 0.5)).deep.equal([\n        [0.0, 1.0, 0], [0.4, 1.01, 1], [0.0, 1.3, 2]\n      ]);\n    });\n  });\n  describe('defineParams(plugin, paramDefs)', function () {\n    it('should define parameter instances in a plugin.', function () {\n      var flag = false;\n      var plugin = {\n        params: {},\n        $testParam: function () {\n          flag = true;\n        }\n      };\n      WX.defineParams(plugin, {\n        'testParam': {\n          type: 'Generic', unit: '',\n          default: 0.01, min: 0.0, max: 1.0\n        }\n      });\n      expect(plugin.params.testParam.get()).to.equal(0.01);\n      plugin.params.testParam.set(0.5, 0, 0);\n      expect(flag).to.equal(true);\n      expect(plugin.params.testParam.get()).to.equal(0.5);\n    });\n  });\n  describe('loadClip', function () {\n    it('should return a audio buffer after xhr loading success.', function (done) {\n      var clip = { name: 'ziggy', url: '../sound/loops/drums.mp3' };\n      var progress = false, complete = false;\n      WX.loadClip(clip,\n        function (clip) {\n          complete = true;\n          expect(progress).to.equal(true);\n          expect(complete).to.equal(true);\n          expect(clip.buffer.duration).to.be.within(5.19, 5.24);\n          done();\n        },\n        function (event) {\n          progress = true;\n          expect(event.loaded).to.be.within(0, event.total);\n        }\n      );\n    });\n  });\n\n});\n\n// Core: Plug-in Utilities\ndescribe('Core: Plug-in Utilities', function () {\n\n  // dummy setup for testing\n  function MyGenerator(preset) {\n    WX.PlugIn.defineType(this, 'Generator');\n    WX.defineParams(this, {\n      p1: {\n        type: 'Boolean',\n        default: false\n      },\n      p2: {\n        type: 'Boolean',\n        default: true\n      }\n    });\n    WX.PlugIn.initPreset(this, preset);\n  }\n\n  MyGenerator.prototype = {\n    info: {\n      api_version: '1.0.0-alpha2',\n      type: 'Generator'\n    },\n    defaultPreset: {\n      p1: false,\n      p2: true\n    },\n    $p1: function(value, time, xtype) {\n      return value ? 'pass' : 'fail';\n    },\n    $p2: function(value, time, xtype) {\n      return value ? 'pass' : 'fail';\n    }\n  };\n\n  WX.PlugIn.extendPrototype(MyGenerator, 'Generator');\n\n  function MyProcessor() {\n    WX.PlugIn.defineType(this, 'Processor');\n  }\n\n  MyProcessor.prototype = {};\n\n  WX.PlugIn.extendPrototype(MyProcessor, 'Processor');\n\n  function MyAnalyzer() {\n    WX.PlugIn.defineType(this, 'Analyzer');\n  }\n\n  MyAnalyzer.prototype = {};\n\n  WX.PlugIn.extendPrototype(MyAnalyzer, 'Analyzer');\n\n  var gen = new MyGenerator({\n    p1: true,\n    p2: false\n  });\n  var pro = new MyProcessor(),\n      ana = new MyAnalyzer();\n\n  describe('defineType(plugin, type)', function () {\n    it('should import required components to plugin based on type specifier.',\n      function () {\n        expect(gen).to.contain.keys('params', '_output', '_outlet');\n        expect(pro).to.contain.keys('params', '_inlet', '_bypass');\n        expect(ana).to.contain.keys('params', '_inlet', '_input');\n      }\n    );\n  });\n  describe('extendPrototype(plugin, type)', function () {\n    it('should extend prototype with core plugin methods.',\n      function () {\n        // generator\n        expect(gen).to.respondTo('get');\n        expect(gen).to.respondTo('set');\n        expect(gen).to.respondTo('getPreset');\n        expect(gen).to.respondTo('setPreset');\n        expect(gen).to.respondTo('$output');\n        expect(gen).to.respondTo('cut');\n        expect(gen).to.respondTo('to');\n        expect(gen.$p1(true)).to.equal('pass');\n        expect(gen.$p2(false)).to.equal('fail');\n        // processor\n        expect(pro).to.respondTo('get');\n        expect(pro).to.respondTo('set');\n        expect(pro).to.respondTo('getPreset');\n        expect(pro).to.respondTo('setPreset');\n        expect(pro).to.respondTo('$bypass');\n        expect(pro).to.respondTo('$input');\n        expect(pro).to.respondTo('$output');\n        expect(pro).to.respondTo('cut');\n        expect(pro).to.respondTo('to');\n        // analyzer\n        expect(ana).to.respondTo('get');\n        expect(ana).to.respondTo('set');\n        expect(ana).to.respondTo('getPreset');\n        expect(ana).to.respondTo('setPreset');\n        expect(ana).to.respondTo('$input');\n        expect(ana).to.respondTo('cut');\n        expect(ana).to.respondTo('to');\n      }\n    );\n  });\n  describe('initPreset(plugin, preset)', function () {\n    it('should initialize plugin preset from arguments and default preset.',\n      function () {\n        expect(gen.get('p1')).to.equal(true);\n        expect(gen.get('p2')).to.equal(false);\n      }\n    );\n  });\n  describe('register(pluginConstructor)', function () {\n    it('should register plugin class under namespace WX.',\n      function () {\n        WX.PlugIn.register(MyGenerator);\n        var myGen = WX.MyGenerator();\n        expect(myGen).to.respondTo('get');\n        expect(myGen).to.respondTo('set');\n        expect(myGen).to.respondTo('getPreset');\n        expect(myGen).to.respondTo('setPreset');\n        expect(myGen).to.respondTo('$output');\n        expect(myGen).to.respondTo('cut');\n        expect(myGen).to.respondTo('to');\n        expect(myGen.$p1(true)).to.equal('pass');\n        expect(myGen.$p2(false)).to.equal('fail');\n      }\n    );\n  });\n\n});\n\n// Stock PlugIn: Fader\n// Because Fader is included in the core as 'WX.Master'\ndescribe('Plug-in: Fader', function () {\n  it('should set parameters correctly. (BEEP)', function (done) {\n    // test patch: osc is needed to run the AudioParam automation\n    var osc = WX.OSC();\n    var fader = WX.Fader({ bypass: true });\n    osc.start(0);\n    osc.to(fader._inlet);\n    fader.to(WX.Master);\n    fader.set('input', 0.25);\n    fader.set('dB', -6.0);\n    // test preset values\n    var preset = fader.getPreset();\n    expect(fader._inlet).to.have.property('gain');\n    expect(fader._outlet).to.have.property('gain');\n    expect(preset.bypass).to.equal(true);\n    expect(preset.mute).to.equal(false);\n    expect(preset.input).to.equal(0.25);\n    expect(preset.dB).to.equal(-6.0);\n    expect(fader.info.name).to.equal('Fader');\n    // TO FIX (hoch): revise .set method for all 3 browsers. Chrome and Safari\n    // work same way, so fix this for the FireFox.\n    setTimeout(function () {\n      fader._output.gain.cancel(0);\n      expect(fader._output.gain.value).to.equal(0.5011872053146362);\n      osc.stop(0);\n      done();\n    }, 100);\n  });\n});"
  },
  {
    "path": "test/test-setup.js",
    "content": "(function (WX) {\n\n\tvar domClientVersion = document.querySelector('#client-ver'),\n\t  \tdomWAAXVersion = document.querySelector('#waax-ver');\n\n\tdomClientVersion.textContent = 'CLIENT VERSION: ' +\n\t\tnavigator.userAgent.toLowerCase();\n\tdomWAAXVersion.textContent = 'WAAX VERSION: ' + WX.getVersion();\n\n})(WX);"
  },
  {
    "path": "test/test-timebase.js",
    "content": "/**\n * test-timebase.js\n *\n * @description   mocha + chai test suite for WAAX:timebase library\n * @author        hoch (hongchan.choi@gmail.com)\n * @version       1.0.0-alpha2\n */\n\n\n// caching\nvar expect = chai.expect,\n    should = chai.should();\n\nvar TX = WX.Transport;\n\n// test data\nvar TEST_DATA = [\n  [0, 0, 997, 1007], [1, 1, 534, 613], [2, 2, 988, 1102],\n  [3, 3, 85, 141], [4, 4, 1001, 1108], [5, 5, 722, 832],\n  [6, 6, 751, 779], [7, 7, 720, 730], [8, 8, 1188, 1265],\n  [9, 9, 992, 1007], [10, 10, 255, 374], [11, 11, 143, 158],\n  [12, 12, 565, 684], [13, 13, 286, 327], [14, 14, 215, 264],\n  [15, 15, 806, 833], [16, 16, 255, 269], [17, 17, 134, 216],\n  [18, 18, 993, 1102], [19, 19, 1006, 1114], [20, 20, 794, 813],\n  [21, 21, 773, 807], [22, 22, 1065, 1088], [23, 23, 1010, 1051],\n  [24, 24, 792, 840], [25, 25, 1114, 1178], [26, 26, 266, 318],\n  [27, 27, 1005, 1034], [28, 28, 307, 391], [29, 29, 573, 676],\n  [30, 30, 701, 805], [31, 31, 648, 687], [32, 32, 437, 474],\n  [33, 33, 158, 265], [34, 34, 680, 718], [35, 35, 227, 337],\n  [36, 36, 510, 592], [37, 37, 792, 825], [38, 38, 260, 294],\n  [39, 39, 518, 590], [40, 40, 350, 419], [41, 41, 493, 562],\n  [42, 42, 968, 993], [43, 43, 721, 746], [44, 44, 299, 340],\n  [45, 45, 484, 557], [46, 46, 485, 505], [47, 47, 1091, 1149],\n  [48, 48, 800, 826], [49, 49, 360, 443], [50, 50, 356, 463],\n  [51, 51, 668, 753], [52, 52, 227, 248], [53, 53, 245, 321],\n  [54, 54, 457, 487], [55, 55, 1059, 1139], [56, 56, 1148, 1190],\n  [57, 57, 12, 31], [58, 58, 799, 852], [59, 59, 515, 529],\n  [60, 60, 627, 682], [61, 61, 651, 678], [62, 62, 431, 535],\n  [63, 63, 1082, 1147], [64, 64, 1189, 1288], [65, 65, 1085, 1147],\n  [66, 66, 819, 935], [67, 67, 658, 685], [68, 68, 941, 1010],\n  [69, 69, 587, 702], [70, 70, 434, 495], [71, 71, 35, 60],\n  [72, 72, 677, 792], [73, 73, 230, 307], [74, 74, 149, 183],\n  [75, 75, 303, 357], [76, 76, 632, 683], [77, 77, 484, 576],\n  [78, 78, 415, 432], [79, 79, 781, 838], [80, 80, 556, 577],\n  [81, 81, 55, 164], [82, 82, 522, 550], [83, 83, 566, 626],\n  [84, 84, 1012, 1061], [85, 85, 734, 789], [86, 86, 587, 685],\n  [87, 87, 232, 248], [88, 88, 707, 729], [89, 89, 199, 230],\n  [90, 90, 683, 710], [91, 91, 183, 221], [92, 92, 495, 503],\n  [93, 93, 271, 291], [94, 94, 34, 137], [95, 95, 392, 454],\n  [96, 96, 499, 595], [97, 97, 99, 126], [98, 98, 808, 916],\n  [99, 99, 832, 885], [100, 100, 995, 1024], [101, 101, 808, 907],\n  [102, 102, 1041, 1148], [103, 103, 126, 225], [104, 104, 467, 570],\n  [105, 105, 150, 160], [106, 106, 519, 571], [107, 107, 106, 125],\n  [108, 108, 1072, 1184], [109, 109, 1121, 1178], [110, 110, 84, 194],\n  [111, 111, 851, 954], [112, 112, 383, 469], [113, 113, 1135, 1187],\n  [114, 114, 540, 576], [115, 115, 804, 892], [116, 116, 1146, 1212],\n  [117, 117, 244, 353], [118, 118, 359, 468], [119, 119, 311, 362],\n  [120, 120, 324, 378], [121, 121, 841, 881], [122, 122, 264, 288],\n  [123, 123, 737, 815], [124, 124, 510, 525], [125, 125, 245, 286],\n  [126, 126, 222, 266]\n];\n\n\n/**\n * Utilities\n */\n\ndescribe('Timebase: Util', function() {\n\n  describe('mbst2tick(mtime)', function () {\n    it('should return tick from MBST time.', function () {\n      expect(WX.mbst2tick({ beat: 0, tick: 240 })).to.equal(240);\n      expect(WX.mbst2tick({ beat: 1, tick: 0 })).to.equal(480);\n      expect(WX.mbst2tick({ beat: 1, tick: 240 })).to.equal(720);\n    });\n  });\n\n  describe('tick2mbst(tick)', function () {\n    it('should return MBST format from tick.', function () {\n      expect(WX.tick2mbst(240)).deep.equal({\n        measure: 0, beat: 0, sixteenth: 2, tick: 0\n      });\n      expect(WX.tick2mbst(480)).deep.equal({\n        measure: 0, beat: 1, sixteenth: 0, tick: 0\n      });\n      expect(WX.tick2mbst(740)).deep.equal({\n        measure: 0, beat: 1, sixteenth: 2, tick: 20\n      });\n    });\n  });\n\n});\n\n\n/**\n * @class Note\n */\n\ndescribe('Timebase: Note', function() {\n\n  describe('WX.Note(pitch, velocity, start, duration)', function () {\n    it('should return a Note object.', function () {\n      var note1 = WX.Note(60, 64, 0, 120);\n      expect(note1).to.have.property('pitch', 60);\n      expect(note1).to.have.property('velocity', 64);\n      expect(note1).to.have.property('start', 0);\n      expect(note1).to.have.property('duration', 120);\n    });\n  });\n\n  describe('changeDuration(delta)', function () {\n    it('should change note duration.', function () {\n      var note = WX.Note(60, 64, 0, 120);\n      note.changeDuration(120);\n      expect(note).to.have.property('duration', 240);\n    });\n  });\n\n  describe('setNote(Note)', function () {\n    it('should copy note properties.', function () {\n      var note1 = WX.Note(1, 2, 3, 4),\n          note2 = WX.Note();\n      note2.setNote(note1);\n      expect(note2).deep.equal(note1);\n    });\n  });\n\n  describe('translatePitch(delta)', function () {\n    it('should move note`s pitch by delta.', function () {\n      var note = WX.Note(60, 64, 0, 120);\n      note.translatePitch(32);\n      expect(note).to.have.property('pitch', 92);\n      note.translatePitch(64);\n      expect(note).to.have.property('pitch', 127);\n      note.translatePitch(-128);\n      expect(note).to.have.property('pitch', 0);\n    });\n  });\n\n  describe('translateStart(delta)', function () {\n    it('should move a note tick by delta.', function () {\n      var note = WX.Note(60, 64, 0, 120);\n      note.translateStart(10);\n      expect(note).to.have.property('start', 10);\n      expect(note.getEnd()).to.equal(130);\n      note.translateStart(-20);\n      expect(note).to.have.property('start', 0);\n      expect(note.getEnd()).to.equal(120);\n    });\n  });\n\n  describe('valueOf()', function () {\n    it('should return start time for easier comparison.', function () {\n      var note1 = WX.Note(60, 64, 0, 120),\n          note2 = WX.Note(60, 64, 120, 240);\n      expect(note1 < note2).to.equal(true);\n    });\n  });\n\n  describe('toString()', function () {\n    it('should return string from data.', function () {\n      var note1 = WX.Note(60, 64, 0, 120);\n      expect(note1.toString()).to.equal('60,64,0,120');\n    });\n  });\n\n});\n\n\n/**\n * @class  NoteClip\n */\n\ndescribe('Timebase: NoteClip', function() {\n\n  describe('push(note)', function () {\n    it('should push multiple notes into a clip.', function () {\n      var noteclip = WX.NoteClip();\n      for (var i = 0; i < TEST_DATA.length; i++) {\n        noteclip.push(WX.Note.apply(WX, TEST_DATA[i]));\n      }\n      expect(noteclip.getSize()).to.equal(127);\n    });\n  });\n\n  describe('findNoteIdAtPosition(pitch, tick)', function () {\n    it('should return a note at pitch/tick position.', function () {\n      var noteclip = WX.NoteClip();\n      for (var n = 0; n < 10; n++) {\n        noteclip.push(WX.Note(60 + n, 64, 120 * n, 120 * n + 120));\n      }\n      expect(noteclip.findNoteIdAtPosition(60, 60)).to.not.equal(null);\n      expect(noteclip.findNoteIdAtPosition(61, 60)).to.equal(null);\n    });\n  });\n\n  describe('findNotesIdInArea(minPitch, maxPitch, startTick, endTick)',\n    function () {\n      it('should return notes at in pitch/time area.', function () {\n        var noteclip = WX.NoteClip();\n        for (var n = 0; n < 10; n++) {\n          noteclip.push(WX.Note(60 + n, 64, 120 * n, 120 * n + 120));\n        }\n        expect(noteclip.findNotesIdInArea(62, 64, 60, 240)).to.have.length(1);\n        expect(noteclip.findNotesIdInArea(66, 69, 600, 960)).to.have.length(3);\n        expect(noteclip.findNotesIdInArea(60, 69, 0, 1200)).to.have.length(10);\n      }\n    );\n  });\n\n  describe('scanNotesInTimeSpan(start, end)', function () {\n    it('should return notes at between start/end time.', function () {\n      var noteclip = WX.NoteClip();\n      for (var n = 0; n < 10; n++) {\n        noteclip.push(WX.Note(60 + n, 64, 120 * n, 120 * n + 120));\n      }\n      expect(noteclip.scanNotesInTimeSpan(60, 240)).to.have.length(2);\n      expect(noteclip.scanNotesInTimeSpan(600, 960)).to.have.length(4);\n      expect(noteclip.scanNotesInTimeSpan(0, 1200)).to.have.length(10);\n    });\n  });\n\n  describe('getSize()', function () {\n    it('should return note clip size.', function () {\n      var noteclip = WX.NoteClip();\n      var data = [];\n      for (var n = 0; n < 4; n++) {\n        data.push(WX.Note(60 + n, 64, 120 * n, 120 * n + 120));\n      }\n      var id0 = noteclip.push(data[0]);\n      var id1 = noteclip.push(data[1]);\n      noteclip.push(data[2]);\n      expect(noteclip.getSize()).to.equal(3);\n      noteclip.delete(id0);\n      expect(noteclip.getSize()).to.equal(2);\n      noteclip.delete(id1);\n      expect(noteclip.getSize()).to.equal(1);\n    });\n  });\n\n  describe('empty()', function () {\n    it('should empty the list.', function () {\n      var input = [];\n      for (var n = 0; n < 10; n++) {\n        var start = ~~(Math.random() * 1200);\n        input.push(WX.Note(60, 64, start, start + 120));\n      }\n      var noteclip = WX.NoteClip();\n      for (var i = 0; i < input.length; i++) {\n        noteclip.push(input[i]);\n      }\n      noteclip.empty();\n      expect(noteclip.getSize()).to.equal(0);\n    });\n  });\n\n  describe('iterate(callback)', function () {\n    it('should iterate all items with callback function.', function () {\n      var id = [],\n          noteclip = WX.NoteClip();\n      for (var n = 0; n < 3; n++) {\n        id[n] = noteclip.push(WX.Note(60 + n, 64, 120 * n, 120 * n + 120));\n      }\n      noteclip.iterate(function (id, note, index) {\n        note.duration *= 0.5;\n        note.start *= 0.5;\n      });\n      expect(noteclip.get([id[0]])).to.have.property('start', 0);\n      expect(noteclip.get([id[1]])).to.have.property('start', 60);\n      expect(noteclip.get([id[2]])).to.have.property('duration', 180);\n    });\n  });\n\n  describe('delete(note)', function () {\n    it('should delete items from noteclip.', function () {\n      var id, noteclip = WX.NoteClip();\n      for (var i = 0; i < TEST_DATA.length; i++) {\n        noteclip.push(WX.Note.apply(WX, TEST_DATA[i]));\n      }\n      id = noteclip.getAllId();\n      for (i = 0; i < ~~(TEST_DATA.length / 2); i++) {\n        noteclip.delete(id[i]);\n      }\n      var rest = TEST_DATA.length - ~~(TEST_DATA.length / 2);\n      expect(noteclip.getSize()).deep.equal(rest);\n    });\n  });\n\n  describe('hasId(id)', function () {\n    it('should return true if a note with a certain id exists in the clip.',\n      function () {\n        var noteclip = WX.NoteClip(), id;\n        for (var i = 0; i < TEST_DATA.length; i++) {\n          noteclip.push(WX.Note.apply(WX, TEST_DATA[i]));\n        }\n        id = noteclip.getAllId();\n        expect(noteclip.hasId(id[0])).to.equal(true);\n        expect(noteclip.hasId('x071')).to.equal(false);\n      }\n    );\n  });\n\n});\n\n\n/**\n * @class  Transporter\n */\n\ndescribe('Timebase: Transport', function() {\n\n  beforeEach(function () {\n    // this will reset BPM/oldBPM to 120\n    TX.setBPM(120);\n    TX.setBPM(120);\n    TX.setNow(0);\n  });\n\n  // OK\n  describe('tick2sec(tick)', function () {\n    it('should convert tick to second.', function () {\n      expect(TX.tick2sec(480)).to.equal(0.5);\n      TX.setBPM(60);\n      expect(TX.tick2sec(480)).to.equal(1.0);\n    });\n  });\n\n  // OK\n  describe('sec2tick(sec)', function () {\n    it('should convert second to tick.', function () {\n      expect(TX.sec2tick(1.0)).to.equal(960);\n      TX.setBPM(60);\n      expect(TX.sec2tick(1.0)).to.equal(480);\n    });\n  });\n\n  // OK\n  describe('setBPM(BPM)', function () {\n    it('should set current BPM and rearrange timeline.', function () {\n      TX.setBPM(60); // BPM 120 -> BPM 60\n      expect(TX._BPM).to.equal(60);\n      expect(TX._BIS).to.equal(1);\n      expect(TX._TIS).to.be.within(0.002083, 0.002084);\n      expect(TX._lookAhead).to.be.within(0.033333, 0.033334);\n    });\n  });\n\n  // OK\n  describe('setNow(tick)', function () {\n    it('should set current playback position in tick.', function () {\n      TX.setNow(240);\n      expect(TX.tick2sec(TX.getNow())).to.equal(0.25);\n      TX.setBPM(60);\n      TX.setNow(240);\n      expect(TX.tick2sec(TX.getNow())).to.equal(0.5);\n    });\n  });\n\n  // OK\n  describe('setLoop(start, end)', function () {\n    it('should set loop points in tick.', function () {\n      TX.setLoopStart(120);\n      TX.setLoopEnd(480);\n      expect(TX._loopStart).to.equal(0.125);\n      expect(TX._loopEnd).to.equal(0.5);\n    });\n  });\n\n  describe('getBPM()', function () {\n    it('should return current BPM.', function () {\n      expect(TX.getBPM()).to.equal(120);\n      TX.setBPM(60);\n      expect(TX.getBPM()).to.equal(60);\n    });\n  });\n\n  describe('getNow()', function () {\n    it('should return current playhead position in tick.', function () {\n      TX.setNow(480);\n      // logic: tick is musical unit, does not change on BPM change\n      TX.setBPM(60);\n      expect(TX.getNow()).to.equal(480);\n      TX.setBPM(120);\n      expect(TX.getNow()).to.equal(480);\n    });\n  });\n\n  describe('Timed operation: start(), pause(), rewind()', function () {\n    it('should start, pause and rewind properly.', function (done) {\n      TX.start();\n      setTimeout(function () {\n        expect(TX.isRunning()).to.equal(true);\n        // when BPM=120, 500ms is 1 beat, that is 480 tick.\n        expect(TX.getNow()).to.be.within(465, 505);\n        setTimeout(function () {\n          TX.pause();\n          expect(TX.isRunning()).to.equal(false);\n          // when BPM=120, 1000ms is 2 beats, that is 960 tick.\n          expect(TX.getNow()).to.be.within(945, 990);\n          TX.rewind();\n          expect(TX.getNow()).to.be.equal(0.0);\n          done();\n        }, 500);\n      }, 500);\n    });\n  });\n\n});"
  }
]