Update to iD v2.15.0
authorBryan Housel <bryan@mapbox.com>
Tue, 21 May 2019 17:23:10 +0000 (13:23 -0400)
committerBryan Housel <bryan@mapbox.com>
Tue, 21 May 2019 17:23:10 +0000 (13:23 -0400)
82 files changed:
vendor/assets/iD/iD.css.erb
vendor/assets/iD/iD.js
vendor/assets/iD/iD/img/community-sprite.svg
vendor/assets/iD/iD/img/fa-sprite.svg
vendor/assets/iD/iD/img/iD-sprite.svg
vendor/assets/iD/iD/img/temaki-sprite.svg
vendor/assets/iD/iD/img/tnp-sprite.svg [new file with mode: 0644]
vendor/assets/iD/iD/locales/af.json
vendor/assets/iD/iD/locales/ar.json
vendor/assets/iD/iD/locales/ast.json
vendor/assets/iD/iD/locales/bg.json
vendor/assets/iD/iD/locales/bn.json
vendor/assets/iD/iD/locales/bs.json
vendor/assets/iD/iD/locales/ca.json
vendor/assets/iD/iD/locales/ckb.json
vendor/assets/iD/iD/locales/cs.json
vendor/assets/iD/iD/locales/cy.json
vendor/assets/iD/iD/locales/da.json
vendor/assets/iD/iD/locales/de.json
vendor/assets/iD/iD/locales/dv.json
vendor/assets/iD/iD/locales/el.json
vendor/assets/iD/iD/locales/en-GB.json
vendor/assets/iD/iD/locales/en.json
vendor/assets/iD/iD/locales/eo.json
vendor/assets/iD/iD/locales/es.json
vendor/assets/iD/iD/locales/et.json
vendor/assets/iD/iD/locales/eu.json
vendor/assets/iD/iD/locales/fa.json
vendor/assets/iD/iD/locales/fi.json
vendor/assets/iD/iD/locales/fr.json
vendor/assets/iD/iD/locales/gl.json
vendor/assets/iD/iD/locales/gu.json
vendor/assets/iD/iD/locales/he.json
vendor/assets/iD/iD/locales/hi.json
vendor/assets/iD/iD/locales/hr.json
vendor/assets/iD/iD/locales/hu.json
vendor/assets/iD/iD/locales/hy.json
vendor/assets/iD/iD/locales/id.json
vendor/assets/iD/iD/locales/is.json
vendor/assets/iD/iD/locales/it.json
vendor/assets/iD/iD/locales/ja.json
vendor/assets/iD/iD/locales/kn.json
vendor/assets/iD/iD/locales/ko.json
vendor/assets/iD/iD/locales/ku.json
vendor/assets/iD/iD/locales/lt.json
vendor/assets/iD/iD/locales/lv.json
vendor/assets/iD/iD/locales/mg.json
vendor/assets/iD/iD/locales/mk.json
vendor/assets/iD/iD/locales/ml.json
vendor/assets/iD/iD/locales/ms.json
vendor/assets/iD/iD/locales/ne.json
vendor/assets/iD/iD/locales/nl.json
vendor/assets/iD/iD/locales/no.json
vendor/assets/iD/iD/locales/pap.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/pl.json
vendor/assets/iD/iD/locales/pt-BR.json
vendor/assets/iD/iD/locales/pt.json
vendor/assets/iD/iD/locales/ro.json
vendor/assets/iD/iD/locales/ru.json
vendor/assets/iD/iD/locales/si.json
vendor/assets/iD/iD/locales/sk.json
vendor/assets/iD/iD/locales/sl.json
vendor/assets/iD/iD/locales/so.json
vendor/assets/iD/iD/locales/sq.json
vendor/assets/iD/iD/locales/sr.json
vendor/assets/iD/iD/locales/sv.json
vendor/assets/iD/iD/locales/ta.json
vendor/assets/iD/iD/locales/te.json
vendor/assets/iD/iD/locales/th.json
vendor/assets/iD/iD/locales/tl.json
vendor/assets/iD/iD/locales/tr.json
vendor/assets/iD/iD/locales/uk.json
vendor/assets/iD/iD/locales/vi.json
vendor/assets/iD/iD/locales/yue.json
vendor/assets/iD/iD/locales/zh-CN.json
vendor/assets/iD/iD/locales/zh-HK.json
vendor/assets/iD/iD/locales/zh-TW.json
vendor/assets/iD/iD/locales/zh.json
vendor/assets/iD/iD/mapillary-js/mapillary.js
vendor/assets/iD/iD/mapillary-js/mapillary.js.map
vendor/assets/iD/iD/mapillary-js/mapillary.min.css
vendor/assets/iD/iD/mapillary-js/mapillary.min.js

index 8fed86e..760ed8b 100644 (file)
@@ -122,7 +122,7 @@ input[type="radio"] {
  */
 
 input[type="search"] {
-    -webkit-appearance: textfield; /* 1 */
+    -webkit-appearance: none; /* 1 */
     -moz-box-sizing: border-box;
     -webkit-box-sizing: border-box; /* 2 */
     box-sizing: border-box;
@@ -268,6 +268,7 @@ g.point .stroke {
     fill: #fff;
 }
 
+
 g.qa_error .shadow,
 g.point .shadow,
 g.note .shadow {
@@ -342,7 +343,7 @@ g.vertex.selected .shadow {
 .preset-icon .icon.iD-other-line {
     color: #989898;
 }
-.preset-icon-line path.casing {
+.preset-icon-container path.line.casing {
     stroke: #afafaf;
 }
 
@@ -360,6 +361,8 @@ path.shadow {
     stroke: #f6634f;
     stroke-width: 16;
     stroke-opacity: 0;
+    stroke-linecap: round;
+    stroke-linejoin: round;
 }
 
 path.shadow.related:not(.selected),
@@ -443,6 +446,15 @@ text.point {
     opacity: 0.8;
 }
 
+
+/* Wikidata-tagged */
+g.point.tag-wikidata path.stroke {
+    stroke-width: 3px;
+    stroke: #777;
+    fill: #ddd;
+}
+
+
 /* Highlighting */
 g.point.highlighted .shadow,
 path.shadow.highlighted {
@@ -499,9 +511,9 @@ path.area.fill {
     fill: rgba(255, 255, 255, 0.3);
     fill-rule: evenodd;
 }
-.preset-icon-fill-area {
-    border: 1px solid rgb(170, 170, 170);
-    background-color: rgba(170, 170, 170, 0.3);
+.preset-icon-fill path.fill {
+    stroke: rgb(170, 170, 170);
+    fill: rgba(170, 170, 170, 0.3);
 }
 
 path.shadow.old-multipolygon,
@@ -512,49 +524,35 @@ path.stroke.old-multipolygon {
 
 
 /* Green things */
-path.stroke.tag-landuse,
 path.stroke.tag-natural,
+path.stroke.tag-natural-wood,
 path.stroke.tag-leisure-nature_reserve,
 path.stroke.tag-leisure-pitch,
 path.stroke.tag-leisure-track,
 path.stroke.tag-leisure-golf_course,
 path.stroke.tag-leisure-garden,
 path.stroke.tag-leisure-park,
+path.stroke.tag-landuse-recreation_ground,
 path.stroke.tag-landuse-forest,
-path.stroke.tag-landuse-wood,
 path.stroke.tag-landuse-grass,
 path.stroke.tag-barrier-hedge {
     stroke: rgb(140, 208, 95);
 }
-path.fill.tag-landuse,
 path.fill.tag-natural,
+path.fill.tag-natural-wood,
 path.fill.tag-leisure-nature_reserve,
 path.fill.tag-leisure-pitch,
 path.fill.tag-leisure-track,
 path.fill.tag-leisure-golf_course,
 path.fill.tag-leisure-garden,
 path.fill.tag-leisure-park,
+path.fill.tag-landuse-recreation_ground,
 path.fill.tag-landuse-forest,
-path.fill.tag-natural-wood,
 path.fill.tag-landuse-grass,
 path.fill.tag-barrier-hedge {
     stroke: rgba(140, 208, 95, 0.3);
     fill: rgba(140, 208, 95, 0.3);
 }
-.preset-icon-fill-area.tag-landuse,
-.preset-icon-fill-area.tag-natural,
-.preset-icon-fill-area.tag-leisure-nature_reserve,
-.preset-icon-fill-area.tag-leisure-pitch,
-.preset-icon-fill-area.tag-leisure-track,
-.preset-icon-fill-area.tag-leisure-golf_course,
-.preset-icon-fill-area.tag-leisure-garden,
-.preset-icon-fill-area.tag-leisure-park,
-.preset-icon-fill-area.tag-landuse-forest,
-.preset-icon-fill-area.tag-natural-wood,
-.preset-icon-fill-area.tag-landuse-grass {
-    border-color: rgb(140, 208, 95);
-    background-color: rgba(140, 208, 95, 0.3);
-}
 .pattern-color-forest,
 .pattern-color-forest_broadleaved,
 .pattern-color-forest_needleleaved,
@@ -567,37 +565,18 @@ path.fill.tag-barrier-hedge {
 
 /* Blue things */
 path.stroke.tag-amenity-fountain,
-path.stroke.tag-amenity-swimming_pool,
 path.stroke.tag-leisure-swimming_pool,
-path.stroke.tag-landuse-aquaculture,
-path.stroke.tag-landuse-basin,
-path.stroke.tag-landuse-harbour,
-path.stroke.tag-landuse-reservoir,
+path.stroke.tag-natural-bay,
 path.stroke.tag-natural-water {
     stroke: rgb(119, 211, 222);
 }
 path.fill.tag-amenity-fountain,
-path.fill.tag-amenity-swimming_pool,
 path.fill.tag-leisure-swimming_pool,
-path.fill.tag-landuse-aquaculture,
-path.fill.tag-landuse-basin,
-path.fill.tag-landuse-harbour,
-path.fill.tag-landuse-reservoir,
+path.fill.tag-natural-bay,
 path.fill.tag-natural-water {
     stroke: rgba(119, 211, 222, 0.3);
     fill: rgba(119, 211, 222, 0.3);
 }
-.preset-icon-fill-area.tag-amenity-fountain,
-.preset-icon-fill-area.tag-amenity-swimming_pool,
-.preset-icon-fill-area.tag-leisure-swimming_pool,
-.preset-icon-fill-area.tag-landuse-aquaculture,
-.preset-icon-fill-area.tag-landuse-basin,
-.preset-icon-fill-area.tag-landuse-harbour,
-.preset-icon-fill-area.tag-landuse-reservoir,
-.preset-icon-fill-area.tag-natural-water {
-    border-color: rgb(119, 211, 222);
-    background-color: rgba(119, 211, 222, 0.3);
-}
 .pattern-color-waves,
 .pattern-color-water_standing,
 .pattern-color-pond {
@@ -635,20 +614,19 @@ path.fill.tag-amenity-university {
     stroke: rgba(255, 255, 148, 0.25);
     fill: rgba(255, 255, 148, 0.25);
 }
-.preset-icon-fill-area.tag-leisure-pitch.tag-sport-beachvolleyball,
-.preset-icon-fill-area.tag-leisure-pitch.tag-sport-baseball,
-.preset-icon-fill-area.tag-leisure-pitch.tag-sport-softball,
-.preset-icon-fill-area.tag-leisure-track,
-.preset-icon-fill-area.tag-natural-beach,
-.preset-icon-fill-area.tag-natural-sand,
-.preset-icon-fill-area.tag-natural-scrub,
-.preset-icon-fill-area.tag-amenity-childcare,
-.preset-icon-fill-area.tag-amenity-kindergarten,
-.preset-icon-fill-area.tag-amenity-school,
-.preset-icon-fill-area.tag-amenity-college,
-.preset-icon-fill-area.tag-amenity-university {
-    border-color: rgb(232, 232, 0);
-    background-color: rgba(255, 255, 148, 0.25);
+.preset-icon-fill path.area.stroke.tag-leisure-pitch.tag-sport-beachvolleyball,
+.preset-icon-fill path.area.stroke.tag-leisure-pitch.tag-sport-baseball,
+.preset-icon-fill path.area.stroke.tag-leisure-pitch.tag-sport-softball,
+.preset-icon-fill path.area.stroke.tag-leisure-track,
+.preset-icon-fill path.area.stroke.tag-natural-beach,
+.preset-icon-fill path.area.stroke.tag-natural-sand,
+.preset-icon-fill path.area.stroke.tag-natural-scrub,
+.preset-icon-fill path.area.stroke.tag-amenity-childcare,
+.preset-icon-fill path.area.stroke.tag-amenity-kindergarten,
+.preset-icon-fill path.area.stroke.tag-amenity-school,
+.preset-icon-fill path.area.stroke.tag-amenity-college,
+.preset-icon-fill path.area.stroke.tag-amenity-university {
+    stroke: rgb(232, 232, 0);
 }
 .pattern-color-beach,
 .pattern-color-sand,
@@ -666,11 +644,6 @@ path.fill.tag-landuse-residential {
     stroke: rgba(196, 189, 25, 0.3);
     fill: rgba(196, 189, 25, 0.3);
 }
-.preset-icon-fill-area.tag-landuse-residential,
-.preset-icon-fill-area.tag-status-construction {
-    border-color: rgb(196, 189, 25);
-    background: rgba(196, 189, 25, 0.3);
-}
 .pattern-color-construction {
     fill: rgba(196, 189, 25, 0.3);
 }
@@ -692,14 +665,6 @@ path.fill.tag-landuse-military {
     stroke: rgba(214, 136, 26, 0.3);
     fill: rgba(214, 136, 26, 0.3);
 }
-.preset-icon-fill-area.tag-landuse-retail,
-.preset-icon-fill-area.tag-landuse-commercial,
-.preset-icon-fill-area.tag-landuse-landfill,
-.preset-icon-fill-area.tag-military,
-.preset-icon-fill-area.tag-landuse-military {
-    border-color: rgb(214, 136, 26);
-    background-color: rgba(214, 136, 26, 0.3);
-}
 .pattern-color-landfill {
     fill: rgba(214, 136, 26, 0.3);
 }
@@ -715,20 +680,14 @@ path.fill.tag-power-plant {
     stroke: rgba(228, 164, 245, 0.3);
     fill: rgba(228, 164, 245, 0.3);
 }
-.preset-icon-fill-area.tag-landuse-industrial,
-.preset-icon-fill-area.tag-power-plant {
-    border-color: rgb(228, 164, 245);
-    background-color: rgba(228, 164, 245, 0.3);
-}
 
 
 /* Teal things */
 path.stroke.tag-natural-wetland {
     stroke: rgb(153, 225, 170);
 }
-.preset-icon-fill-area.tag-natural-wetland {
-    border-color: rgb(153, 225, 170);
-    background-color: rgba(153, 225, 170, 0.2);
+.preset-icon-fill path.area.fill.tag-natural-wetland {
+    fill: rgba(153, 225, 170, 0.2);
 }
 .pattern-color-wetland,
 .pattern-color-wetland_marsh,
@@ -747,12 +706,12 @@ path.stroke.tag-landuse-meadow,
 path.stroke.tag-landuse-farmland {
     stroke: rgb(191, 232, 63);
 }
-.preset-icon-fill-area.tag-landuse-cemetery,
-.preset-icon-fill-area.tag-landuse-orchard,
-.preset-icon-fill-area.tag-landuse-vineyard,
-.preset-icon-fill-area.tag-landuse-meadow,
-.preset-icon-fill-area.tag-landuse-farmland {
-    background-color: rgba(191, 232, 63, 0.2);
+.preset-icon-fill path.area.fill.tag-landuse-cemetery,
+.preset-icon-fill path.area.fill.tag-landuse-orchard,
+.preset-icon-fill path.area.fill.tag-landuse-vineyard,
+.preset-icon-fill path.area.fill.tag-landuse-meadow,
+.preset-icon-fill path.area.fill.tag-landuse-farmland {
+    fill: rgba(191, 232, 63, 0.2);
 }
 .pattern-color-cemetery,
 .pattern-color-cemetery_christian,
@@ -775,9 +734,8 @@ path.fill.tag-landuse-farmyard {
     stroke: rgba(245, 220, 186, 0.3);
     fill: rgba(245, 220, 186, 0.3);
 }
-.preset-icon-fill-area.tag-landuse-farmyard {
-    border-color: rgb(226, 177, 111);
-    background: rgba(245, 220, 186, 0.3);
+.preset-icon-fill path.area.stroke.tag-landuse-farmyard {
+    stroke: rgb(226, 177, 111);
 }
 .pattern-color-farmyard {
     fill: rgba(245, 220, 186, 0.3);
@@ -790,10 +748,16 @@ path.stroke.tag-landuse-railway,
 path.stroke.tag-landuse-quarry,
 path.stroke.tag-leisure-pitch.tag-sport-basketball,
 path.stroke.tag-leisure-pitch.tag-sport-skateboard,
+path.stroke.tag-man_made-adit,
 path.stroke.tag-man_made-groyne,
 path.stroke.tag-man_made-breakwater,
 path.stroke.tag-natural-bare_rock,
+path.stroke.tag-natural-cave_entrance,
+path.stroke.tag-natural-cliff,
+path.stroke.tag-natural-rock,
 path.stroke.tag-natural-scree,
+path.stroke.tag-natural-stone,
+path.stroke.tag-natural-shingle,
 path.stroke.tag-waterway-dam,
 path.stroke.tag-waterway-weir {
     stroke: rgb(170, 170, 170);
@@ -803,27 +767,21 @@ path.fill.tag-landuse-railway,
 path.fill.tag-landuse-quarry,
 path.fill.tag-leisure-pitch.tag-sport-basketball,
 path.fill.tag-leisure-pitch.tag-sport-skateboard,
+path.fill.tag-man_made-adit,
 path.fill.tag-man_made-groyne,
 path.fill.tag-man_made-breakwater,
 path.fill.tag-natural-bare_rock,
+path.fill.tag-natural-cliff,
+path.fill.tag-natural-cave_entrance,
+path.fill.tag-natural-rock,
 path.fill.tag-natural-scree,
+path.fill.tag-natural-stone,
+path.fill.tag-natural-shingle,
 path.fill.tag-waterway-dam,
 path.fill.tag-waterway-weir {
     stroke: rgba(140, 140, 140, 0.5);
     fill: rgba(140, 140, 140, 0.5);
 }
-.preset-icon-fill-area.tag-amenity-parking,
-.preset-icon-fill-area.tag-landuse-railway,
-.preset-icon-fill-area.tag-landuse-quarry,
-.preset-icon-fill-area.tag-leisure-pitch.tag-sport-basketball,
-.preset-icon-fill-area.tag-leisure-pitch.tag-sport-skateboard,
-.preset-icon-fill-area.tag-natural-bare_rock,
-.preset-icon-fill-area.tag-natural-scree,
-.preset-icon-fill-area.tag-waterway-dam,
-.preset-icon-fill-area.tag-waterway-weir {
-    border-color: rgb(170, 170, 170);
-    background-color: rgba(140, 140, 140, 0.5);
-}
 .pattern-color-quarry {
     fill: rgba(140, 140, 140, 0.5);
 }
@@ -839,12 +797,12 @@ path.fill.tag-natural-glacier {
     stroke: rgba(255, 255, 255, 0.3);
     fill: rgba(255, 255, 255, 0.3);
 }
-.preset-icon-fill-area.tag-natural-cave_entrance,
-.preset-icon-fill-area.tag-natural-glacier {
-    border-color: rgb(170, 170, 170);
-    background: rgba(170, 170, 170, 0.3);
+.preset-icon-fill path.fill.tag-natural-cave_entrance,
+.preset-icon-fill path.fill.tag-natural-glacier {
+    stroke: rgb(170, 170, 170);
+    fill: rgba(170, 170, 170, 0.3);
 }
-/* highways */
+preset-icon-container/* highways */
 
 /* defaults */
 .preset-icon .icon.tag-highway.other-line {
@@ -1166,7 +1124,7 @@ path.line.stroke.tag-highway-steps {
     stroke-width: 1;
 }
 
-
+/* living streets */
 .preset-icon .icon.tag-highway-living-street {
     color: #bbb;
     fill: #ddd;
@@ -1180,6 +1138,7 @@ path.line.casing.tag-living_street {
     stroke: #fff;
 }
 
+/* pedestrian streets and corridors */
 .preset-icon .icon.tag-highway-corridor,
 .preset-icon .icon.tag-highway-pedestrian {
     color: #8cd05f;
@@ -1211,6 +1170,7 @@ path.line.casing.tag-pedestrian.tag-unpaved {
     stroke-dasharray: none;
 }
 
+/* unknown roads */
 .preset-icon .icon.tag-highway-road {
     color: #9e9e9e;
     fill: #666;
@@ -1224,6 +1184,7 @@ path.line.casing.tag-road {
     stroke: #666;
 }
 
+/* service roads */
 .preset-icon .icon.tag-highway-service {
     color: #fff;
     fill: #666;
@@ -1255,10 +1216,7 @@ path.line.casing.tag-service.tag-service {
     stroke: #666;
 }
 
-.preset-icon .icon.tag-highway-track {
-    color: #eaeaea;
-    fill: #c5b59f;
-}
+/* unmaintained track roads */
 path.line.stroke.tag-highway-track,
 path.line.stroke.tag-track {
     stroke: #c5b59f;
@@ -1268,6 +1226,7 @@ path.line.casing.tag-track {
     stroke: #746f6f;
 }
 
+/* paths */
 path.line.stroke.tag-highway-path,
 path.line.stroke.tag-highway-footway,
 path.line.stroke.tag-highway-cycleway,
@@ -1283,8 +1242,20 @@ path.line.stroke.tag-highway-bridleway {
     stroke-dasharray: 3, 3;
 }
 
+/* style for features that should have highway=footway but don't yet */
+path.line.stroke.tag-crossing,
+path.line.stroke.tag-public_transport-platform,
+path.line.stroke.tag-highway-platform,
+path.line.stroke.tag-railway-platform,
+path.line.stroke.tag-man_made-pier {
+    stroke: #dca;
+}
+
 path.line.casing.tag-highway-path,
-path.line.casing.tag-highway-path.tag-unpaved {
+path.line.casing.tag-highway-path.tag-unpaved,
+path.line.casing.tag-highway-footway.tag-public_transport-platform,
+path.line.casing.tag-highway-footway.tag-man_made-pier,
+path.line.casing.tag-highway.tag-crossing {
     stroke: #dca;
     stroke-linecap: round;
     stroke-dasharray: none;
@@ -1300,8 +1271,9 @@ path.line.casing.tag-highway-bridleway.tag-unpaved {
     stroke-dasharray: none;
 }
 
-.preset-icon .icon.iD-category-path,
-.preset-icon .icon.tag-highway-path {
+.preset-icon .icon.tag-highway-path,
+.preset-icon .icon.tag-highway-footway.tag-public_transport-platform,
+.preset-icon .icon.tag-highway-footway.tag-man_made-pier {
     color: #988;
     fill: #dca;
 }
@@ -1309,6 +1281,7 @@ path.line.stroke.tag-highway-path {
     stroke: #988;
 }
 
+/* footways */
 .preset-icon .icon.tag-route-foot,
 .preset-icon .icon.tag-route-hiking,
 .preset-icon .icon.tag-highway-footway {
@@ -1316,39 +1289,55 @@ path.line.stroke.tag-highway-path {
     fill: #fff;
 }
 path.line.stroke.tag-highway-footway,
-.preset-icon-line path.casing.tag-highway-footway {
+path.line.stroke.tag-highway_bus_stop,
+.preset-icon-container path.casing.tag-highway-footway {
     stroke: #988;
 }
-.preset-icon-line path.stroke.tag-highway-footway {
+.preset-icon-container path.stroke.tag-highway-footway:not(.tag-crossing-marked):not(.tag-crossing-unmarked):not(.tag-man_made-pier):not(.tag-public_transport-platform) {
     stroke: #fff;
 }
 
+/* cycleways */
 .preset-icon .icon.tag-route-bicycle,
 .preset-icon .icon.tag-highway-cycleway {
     color: #58a9ed;
     fill: #fff;
 }
 path.line.stroke.tag-highway-cycleway,
-.preset-icon-line path.casing.tag-highway-cycleway {
+.preset-icon-container path.casing.tag-highway-cycleway {
     stroke: #58a9ed;
 }
-.preset-icon-line path.stroke.tag-highway-cycleway {
+.preset-icon-container path.stroke.tag-highway-cycleway:not(.tag-crossing) {
     stroke: #fff;
 }
 
+/* bridleways */
 .preset-icon .icon.tag-route-horse,
 .preset-icon .icon.tag-highway-bridleway {
     color: #e06d5f;
     fill: #fff;
 }
 path.line.stroke.tag-highway-bridleway,
-.preset-icon-line path.casing.tag-highway-bridleway {
+.preset-icon-container path.casing.tag-highway-bridleway {
     stroke: #e06d5f;
 }
-.preset-icon-line path.stroke.tag-highway-bridleway {
+.preset-icon-container path.stroke.tag-highway-bridleway {
+    stroke: #fff;
+}
+
+/* racetracks */
+.preset-icon .icon.tag-leisure-track {
+    color: rgb(229, 184, 43);
+}
+path.line.stroke.tag-leisure-track,
+.preset-icon-container path.casing.tag-highway.tag-leisure-track {
+    stroke: rgb(229, 184, 43);
+}
+.preset-icon-container path.line.stroke.tag-highway.tag-leisure-track {
     stroke: #fff;
 }
 
+/* steps */
 .preset-icon .icon.tag-highway-steps {
     color: #81d25c;
     fill: #fff;
@@ -1367,13 +1356,47 @@ path.line.casing.tag-highway-steps.tag-unpaved {
     stroke-dasharray: none;
 }
 path.line.stroke.tag-highway-steps,
-.preset-icon-line path.line.casing.tag-highway-steps {
+.preset-icon-container path.line.casing.tag-highway-steps {
     stroke: #81d25c;
 }
-.preset-icon-line path.line.stroke.tag-highway-steps {
+.preset-icon-container path.line.stroke.tag-highway-steps {
     stroke: #fff;
 }
 
+
+/* crossings */
+path.line.stroke.tag-highway.tag-crossing-unmarked {
+    stroke-dasharray: 6, 4;
+}
+.low-zoom path.line.stroke.tag-highway.tag-crossing-unmarked {
+    stroke-dasharray: 3, 2;
+}
+path.line.stroke.tag-highway.tag-crossing-marked {
+    stroke-dasharray: 6, 3;
+}
+.low-zoom path.line.stroke.tag-highway.tag-crossing-marked {
+    stroke-dasharray: 3, 1.5;
+}
+path.line.stroke.tag-highway-footway.tag-crossing-marked {
+    stroke: #4c4444;
+}
+.preset-icon .icon.tag-highway-footway.tag-crossing-marked {
+    color: #4c4444;
+}
+path.line.stroke.tag-highway-footway.tag-crossing-unmarked {
+    stroke: #776a6a;
+}
+.preset-icon .icon.tag-highway-footway.tag-crossing-unmarked {
+    color: #776a6a;
+}
+path.line.stroke.tag-highway-cycleway.tag-crossing-marked {
+    stroke: #446077;
+}
+.preset-icon .icon.tag-highway-cycleway.tag-crossing-marked {
+    color: #446077;
+}
+
+
 /* highway midpoints */
 g.midpoint.tag-highway-corridor .fill,
 g.midpoint.tag-highway-pedestrian .fill,
@@ -1472,7 +1495,7 @@ path.line.stroke.tag-aeroway-runway {
     stroke-width: 2;
     stroke-dasharray: 12, 24;
 }
-.preset-icon-line path.line.stroke.tag-aeroway-runway {
+.preset-icon-container path.line.stroke.tag-aeroway-runway {
     stroke-dasharray: 0, 14, 8, 14;
 }
 /* railways */
@@ -1510,10 +1533,17 @@ path.line.stroke.tag-railway {
     stroke-width: 2;
     stroke-dasharray: 6,6;
 }
-.preset-icon-line path.line.stroke.tag-railway:not(.tag-status) {
+.preset-icon-container path.line.stroke.tag-railway:not(.tag-status) {
     stroke-dasharray: 6;
 }
 
+path.line.casing.tag-railway.tag-railway-platform {
+    stroke-width: 0;
+}
+path.line.stroke.tag-railway.tag-railway-platform {
+    stroke-dasharray: none;
+}
+
 /* styles */
 path.line.casing.tag-railway {
     stroke: #555;
@@ -1551,7 +1581,6 @@ path.line.stroke.tag-railway-subway {
     color: #7dd;
     fill: #7dd;
 }
-.preset-icon .icon.iD-category-water,
 .preset-icon .icon.tag-type-waterway,
 .preset-icon .icon.tag-waterway {
     color: #7dd;
@@ -1643,7 +1672,6 @@ path.line.stroke.tag-waterway-ditch {
     stroke: #39a;
 }
 
-
 /* narrow width miscellanous things */
 path.line.shadow.tag-aerialway,
 path.line.shadow.tag-attraction-summer_toboggan,
@@ -1719,7 +1747,7 @@ path.line.stroke.tag-route-ferry {
     stroke-width: 12;
 }
 .low-zoom path.line.stroke.tag-route-ferry,
-.preset-icon-line path.line.stroke.tag-route-ferry {
+.preset-icon-container path.line.stroke.tag-route-ferry {
     stroke-width: 2;
     stroke-dasharray: 6,4;
 }
@@ -1808,7 +1836,7 @@ path.line.casing.tag-man_made-pipeline {
 .low-zoom path.line.stroke.tag-man_made-pipeline {
     stroke-dasharray: 40, 1;
 }
-.preset-icon-line path.line.stroke.tag-man_made-pipeline {
+.preset-icon-container path.line.stroke.tag-man_made-pipeline {
     stroke-dasharray: 19, 1;
 }
 
@@ -1835,7 +1863,7 @@ path.line.casing.tag-boundary-national_park {
 path.line.stroke.tag-barrier:not(.tag-barrier-hedge) {
     stroke: #ddd;
 }
-.preset-icon-line path.line.stroke.tag-barrier:not(.tag-barrier-hedge) {
+.preset-icon-container path.line.stroke.tag-barrier:not(.tag-barrier-hedge) {
     stroke: rgb(170, 170, 170);
 }
 path.line.casing.tag-natural,
@@ -1858,9 +1886,9 @@ path.line.stroke.tag-man_made-breakwater {
     stroke-linecap: butt;
     stroke-dasharray: 8, 2, 2, 2;
 }
-.preset-icon-line path.line.stroke.tag-barrier,
-.preset-icon-line path.line.stroke.tag-man_made-groyne,
-.preset-icon-line path.line.stroke.tag-man_made-breakwater {
+.preset-icon-container path.line.stroke.tag-barrier,
+.preset-icon-container path.line.stroke.tag-man_made-groyne,
+.preset-icon-container path.line.stroke.tag-man_made-breakwater {
     stroke-dasharray: 1, 4, 6, 4;
 }
 
@@ -2018,34 +2046,34 @@ path.line.casing.tag-status {
     color: #fc6c14;
     fill: #fff;
 }
-path.line.shadow.tag-status.tag-status-construction {
+path.line.shadow.tag-highway.tag-status.tag-status-construction {
     stroke-width: 20;
 }
-path.line.casing.tag-status.tag-status-construction {
+path.line.casing.tag-highway.tag-status.tag-status-construction {
     stroke-width: 10;
     stroke-linecap: butt;
     stroke-dasharray: none
 }
-path.line.stroke.tag-status.tag-status-construction {
+path.line.stroke.tag-highway.tag-status.tag-status-construction {
     stroke-width: 8;
     stroke-linecap: butt;
     stroke-dasharray: 10, 10;
 }
-path.line.casing.tag-status.tag-status-construction,
-.preset-icon-line path.line.stroke.tag-status.tag-status-construction {
+path.line.casing.tag-highway.tag-status.tag-status-construction,
+.preset-icon-container path.line.stroke.tag-highway.tag-status.tag-status-construction {
     stroke: #fff;
 }
-path.line.stroke.tag-status.tag-status-construction,
-.preset-icon-line path.line.casing.tag-status.tag-status-construction {
+path.line.stroke.tag-highway.tag-status.tag-status-construction,
+.preset-icon-container path.line.casing.tag-highway.tag-status.tag-status-construction {
     stroke: #fc6c14;
 }
-.low-zoom path.line.shadow.tag-status.tag-status-construction {
+.low-zoom path.line.shadow.tag-highway.tag-status.tag-status-construction {
     stroke-width: 16;
 }
-.low-zoom path.line.casing.tag-status.tag-status-construction {
+.low-zoom path.line.casing.tag-highway.tag-status.tag-status-construction {
     stroke-width: 7;
 }
-.low-zoom path.line.stroke.tag-status.tag-status-construction {
+.low-zoom path.line.stroke.tag-highway.tag-status.tag-status-construction {
     stroke-width: 5;
     stroke-dasharray: 8, 8;
 }
@@ -2059,123 +2087,6 @@ path.fill.tag-building {
     stroke: rgba(224, 110, 95, 0.3);
     fill: rgba(224, 110, 95, 0.3);
 }
-.preset-icon-fill-area.tag-parking-multi-storey,
-.preset-icon-fill-area.tag-building {
-    border-color: rgb(224, 110, 95);
-    background-color: rgba(224, 110, 95, 0.3);
-}
-
-
-/* "Special" paths - platforms, piers, crossings */
-.preset-icon .icon.tag-golf-path,
-.preset-icon .icon.tag-public_transport-platform,
-.preset-icon .icon.tag-railway-platform,
-.preset-icon .icon.tag-man_made-pier,
-.preset-icon .icon.tag-footway.tag-footway-crossing,
-.preset-icon .icon.tag-crossing {
-    color: #988;
-    fill: #dca;
-}
-
-.preset-icon-fill-area.tag-golf-path,
-.preset-icon-fill-area.tag-public_transport-platform,
-.preset-icon-fill-area.tag-railway-platform,
-.preset-icon-fill-area.tag-man_made-pier,
-.preset-icon-fill-area.tag-footway.tag-footway-crossing,
-.preset-icon-fill-area.tag-crossing {
-    border-color: #988;
-    background-color: #dca;
-}
-
-path.line.shadow.tag-golf-path,
-path.line.shadow.tag-public_transport-platform,
-path.line.shadow.tag-railway-platform,
-path.line.shadow.tag-man_made-pier,
-path.line.shadow.tag-footway.tag-footway-crossing,
-path.line.shadow.tag-crossing {
-    stroke-width: 16;
-}
-path.line.casing.tag-golf-path,
-path.line.casing.tag-public_transport-platform,
-path.line.casing.tag-railway-platform,
-path.line.casing.tag-man_made-pier,
-path.line.casing.tag-footway.tag-footway-crossing,
-path.line.casing.tag-crossing {
-    stroke: #dca;
-    stroke-width: 5;
-    stroke-linecap: round;
-    stroke-dasharray: none;
-}
-path.line.stroke.tag-golf-path,
-path.line.stroke.tag-public_transport-platform,
-path.line.stroke.tag-railway-platform,
-path.line.stroke.tag-man_made-pier,
-path.line.stroke.tag-footway.tag-footway-crossing,
-path.line.stroke.tag-crossing {
-    stroke: #988;
-    stroke-width: 3;
-    stroke-linecap: butt;
-    stroke-dasharray: 6, 6;
-}
-
-.low-zoom path.line.shadow.tag-golf-path,
-.low-zoom path.line.shadow.tag-public_transport-platform,
-.low-zoom path.line.shadow.tag-railway-platform,
-.low-zoom path.line.shadow.tag-man_made-pier,
-.low-zoom path.line.shadow.tag-footway.tag-footway-crossing,
-.low-zoom path.line.shadow.tag-crossing {
-    stroke-width: 12;
-}
-.low-zoom path.line.casing.tag-golf-path,
-.low-zoom path.line.casing.tag-public_transport-platform,
-.low-zoom path.line.casing.tag-railway-platform,
-.low-zoom path.line.casing.tag-man_made-pier,
-.low-zoom path.line.casing.tag-footway.tag-footway-crossing,
-.low-zoom path.line.casing.tag-crossing {
-    stroke-width: 3;
-}
-.low-zoom path.line.stroke.tag-golf-path,
-.low-zoom path.line.stroke.tag-public_transport-platform,
-.low-zoom path.line.stroke.tag-railway-platform,
-.low-zoom path.line.stroke.tag-man_made-pier,
-.low-zoom path.line.stroke.tag-footway.tag-footway-crossing,
-.low-zoom path.line.stroke.tag-crossing {
-    stroke-width: 1;
-    stroke-linecap: butt;
-    stroke-dasharray: 3, 3;
-}
-
-g.midpoint.tag-golf-path .fill,
-g.midpoint.tag-public_transport-platform .fill,
-g.midpoint.tag-railway-platform .fill,
-g.midpoint.tag-man_made-pier .fill,
-g.midpoint.tag-footway.tag-footway-crossing .fill,
-g.midpoint.tag-crossing .fill {
-    fill: #fff;
-    stroke: #333;
-    stroke-opacity: .8;
-    opacity: .8;
-}
-
-/* marked crossings, zebras */
-.preset-icon .icon.tag-crossing.tag-crossing-marked,
-.preset-icon .icon.tag-crossing.tag-crossing-zebra {
-    color: #444;
-    fill: #dca;
-}
-path.line.casing.tag-crossing.tag-crossing-marked,
-path.line.casing.tag-crossing.tag-crossing-zebra {
-    stroke: #dca;
-}
-path.line.stroke.tag-crossing.tag-crossing-marked,
-path.line.stroke.tag-crossing.tag-crossing-zebra {
-    stroke: #444;
-    stroke-dasharray: 6, 4;
-}
-.low-zoom path.line.stroke.tag-crossing.tag-crossing-marked,
-.low-zoom path.line.stroke.tag-crossing.tag-crossing-zebra {
-    stroke-dasharray: 3, 2;
-}
 /* Cursors */
 
 .nope,
@@ -2232,6 +2143,7 @@ path.line.stroke.tag-crossing.tag-crossing-zebra {
     cursor: url(<%= asset_path("iD/img/cursor-select-remove.png") %>), pointer; /* FF */
 }
 
+.mode-add-preset #map,
 .mode-draw-line #map,
 .mode-draw-area #map,
 .mode-add-line  #map,
@@ -2282,20 +2194,23 @@ path.line.stroke.tag-crossing.tag-crossing-zebra {
 .turn circle {
     cursor: pointer;
 }
-
 /* photo viewer div */
 #photoviewer {
-    position: absolute;
-    bottom: 40px;
-    left: 10px;
+    position: relative;
+    flex-shrink: 0;
+    margin-bottom: 10px;
     width: 330px;
     height: 250px;
     padding: 5px;
     background-color: #fff;
 }
+[dir='ltr'] #photoviewer {
+    margin-left: 10px;
+    margin-right: 2px;
+}
 [dir='rtl'] #photoviewer {
-    left: auto;
-    right: 10px;
+    margin-right: 10px;
+    margin-left: 2px;
 }
 
 @media screen and (min-width: 1600px) {
@@ -2465,13 +2380,13 @@ path.line.stroke.tag-crossing.tag-crossing-zebra {
 
 
 /* Mapillary Image Layer */
-.layer-mapillary-images {
+.layer-mapillary {
     pointer-events: none;
 }
-.layer-mapillary-images .viewfield-group * {
+.layer-mapillary .viewfield-group * {
     fill: #55ff22;
 }
-.layer-mapillary-images .sequence {
+.layer-mapillary .sequence {
     stroke: #55ff22;
 }
 
@@ -2496,13 +2411,13 @@ path.line.stroke.tag-crossing.tag-crossing-zebra {
 
 
 /* OpenStreetCam Image Layer */
-.layer-openstreetcam-images {
+.layer-openstreetcam {
     pointer-events: none;
 }
-.layer-openstreetcam-images .viewfield-group * {
+.layer-openstreetcam .viewfield-group * {
     fill: #20c4ff;
 }
-.layer-openstreetcam-images .sequence {
+.layer-openstreetcam .sequence {
     stroke: #20c4ff;
 }
 
@@ -2891,6 +2806,12 @@ label.streetside-hires {
     stroke-width: 60px;
     pointer-events: none;
 }
+.fill-partial path.area.fill.tag-building_part {
+    stroke-width: 40px;
+}
+.fill-partial path.area.fill.tag-indoor {
+    stroke-width: 20px;
+}
 .mode-browse .fill-partial path.area.fill,
 .mode-select .fill-partial path.area.fill {
     pointer-events: visibleStroke;
@@ -3124,7 +3045,6 @@ table.tags, table.tags td, table.tags th {
 /* Grid
 ------------------------------------------------------- */
 .col6  { float: left; width: 50.0000%; max-width: 600px; }
-.col8  { float: left; width: 66.6666%; }
 .col12 { float: left; width: 100.0000%; }
 
 
@@ -3157,10 +3077,12 @@ table.tags, table.tags td, table.tags th {
 .ar { right: 0; }
 
 input.hide,
+textarea.hide,
 div.hide,
 form.hide,
 button.hide,
 a.hide,
+ul.hide,
 li.hide {
     display: none;
 }
@@ -3205,29 +3127,29 @@ button.disabled {
     cursor: not-allowed;
 }
 
-.joined button {
+.joined > * {
     border-radius: 0;
     border-right: 1px solid rgba(0,0,0,.5);
 }
-[dir='rtl'] .joined button {
+[dir='rtl'] .joined > * {
     border-left: 1px solid rgba(0,0,0,.5);
     border-right: none;
 }
 
-.fillL .joined button {
+.fillL .joined > * {
     border-right: 1px solid #fff;
 }
-.joined button:first-child {
+.joined > *:first-child {
     border-radius: 4px 0 0 4px;
 }
-[dir='rtl'] .joined button:first-child {
+[dir='rtl'] .joined > *:first-child {
     border-radius: 0 4px 4px 0;
 }
-.joined button:last-child {
+.joined > *:last-child {
     border-right-width: 0;
     border-radius: 0 4px 4px 0;
 }
-[dir='rtl'] .joined button:last-child {
+[dir='rtl'] .joined > *.bar-button:last-child {
     border-radius: 4px 0 0 4px;
 }
 
@@ -3312,7 +3234,7 @@ button[disabled].action:hover {
     color: #333;
 }
 
-.icon-badge {
+.notification-badge {
     display: block;
     position: absolute;
     width: 10px;
@@ -3321,7 +3243,7 @@ button[disabled].action:hover {
     top: 9px;
 }
 
-.icon-badge.hide {
+.notification-badge.hide {
     display: none;
 }
 
@@ -3333,84 +3255,80 @@ button[disabled].action:hover {
     flex-flow: row nowrap;
     justify-content: space-between;
     position: absolute;
-    padding: 10px;
+    padding: 10px 5px 0px 5px;
     left: 0;
     top: 0;
     right: 0;
-    height: 60px;
-    z-index: 9;
+    z-index: 101;
 }
-
-.tool-group {
+#bar .toolbar-item {
+    display: flex;
+    flex: 0 1 auto;
+    flex-flow: column wrap;
+    justify-content: center;
+    position: relative;
+}
+#bar .toolbar-item .item-content {
     display: flex;
     flex: 0 1 auto;
     flex-flow: row nowrap;
-    width: 100%;
+    justify-content: center;
+    position: relative;
+    height: 40px;
+    width: auto;
+    margin: 0 5px;
 }
-.tool-group.leading-area {
-    flex-shrink: 2;
-    justify-content: flex-start;
+#bar .toolbar-item .item-label {
+    text-align: center;
+    font-size: 11px;
+    white-space: nowrap;
+    margin: 1px 2px 2px 2px;
 }
-.tool-group.center-area {
-    justify-content: center;
+#bar .toolbar-item.spacer {
+    width: 100%;
+    flex-grow: 2;
 }
-.tool-group.trailing-area {
+#bar .toolbar-item:first-child {
     justify-content: flex-start;
 }
-
-.tool-group > div {
-    display: flex;
-    margin: 0 5px;
+#bar .toolbar-item:last-child {
+    justify-content: flex-end;
 }
-.tool-group button {
-    flex: 1 1 auto;
+#bar .toolbar-item:empty:not(.spacer) {
+    display: none;
+}
+button.bar-button {
+    flex: 0 0 auto;
     flex-flow: row nowrap;
     align-items: center;
     padding: 0 10px;
     min-width: 30px;
     white-space: nowrap;
+    display: flex;
 }
-.tool-group button .icon {
+button.bar-button .icon {
     flex: 0 0 20px;
 }
-.tool-group button .label {
+button.bar-button .label {
     flex: 0 1 auto;
     padding: 0 5px;
 }
 
-button.save .count {
-    display: inline-block;
-    border: 0px solid #ccc;
-    border-left-width: 1px;
-    padding: 0px 0px 0px 8px;
-    min-width: 32px;
-    text-align: center;
-}
-[dir='rtl'] button.save .count {
-    border-left-width: 0px;
-    border-right-width: 1px;
-    padding: 0px 8px 0px 0px;
+button.bar-button.dragging {
+    opacity: 0.75;
+    z-index: 200;
 }
-button.save.disabled .count {
-    border: 0px solid rgba(0,0,0,0.25);
-    border-left-width: 1px;
-}
-[dir='rtl'] button.save.disabled .count {
-    border-left-width: 0px;
-    border-right-width: 1px;
-    padding: 0px 8px 0px 0px;
+button.bar-button.dragging .tooltip {
+    display: none;
 }
-#bar.narrow button.save .count {
-    padding: 0px;
+button.bar-button.dragging.removing {
+    cursor: url(<%= asset_path("iD/img/cursor-select-remove.png") %>), pointer;
 }
 
-button.save .label {
-    margin-right: 3px;
-    margin-left: 0;
-}
-[dir='rtl'] button.save .label {
-    margin-left: 3px;
-    margin-right: 0;
+button.save .count {
+    display: inline-block;
+    min-width: 32px;
+    text-align: center;
 }
 
 .help-wrap svg.icon.pre-text.add-note,
@@ -3437,15 +3355,15 @@ button.add-note svg.icon {
 
 .spinner {
     opacity: .5;
-    display: flex;
-    flex-shrink: 2;
-    justify-content: flex-end;
+    position: absolute;
+    right: 4px;
+    bottom: 26px;
 }
 .spinner img {
-    height: 40px;
-    width: 40px;
-    border-radius: 4px;
-    background: black;
+    height: 20px;
+    width: 20px;
+    background: transparent;
+    border-radius: 100%;
 }
 [dir='rtl'] .spinner img {
     -moz-transform: scaleX(-1);
@@ -3457,11 +3375,8 @@ button.add-note svg.icon {
 }
 
 
-#bar.narrow .tool-group {
-    width: unset;
-}
 #bar.narrow .spinner,
-#bar.narrow button .label {
+#bar.narrow button.bar-button .label {
     display: none;
 }
 #bar.narrow button .count {
@@ -3469,65 +3384,288 @@ button.add-note svg.icon {
     border-right-width: 0;
 }
 
+[dir='ltr'] .undo-redo button:first-of-type {
+    margin-right: 1px;
+}
+[dir='rtl'] .undo-redo button:first-of-type {
+    margin-left: 1px;
+}
 
-/* Header for modals / panes
+/* Add a feature search bar
 ------------------------------------------------------- */
-.header {
-    border-bottom: 1px solid #ccc;
-    height: 60px;
+
+.search-add {
+    width: 200%;
+    justify-content: center;
     position: relative;
+    min-width: 150px;
+    max-width: 325px;
 }
-
-.header h3 {
-    text-align: center;
-    margin-bottom: 0;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    padding: 20px;
+.search-add .search-wrap {
+    position: relative;
+    width: 100%;
 }
-
-.header button,
-.modal > button {
-    border-radius: 0;
-    width: 40px;
-    text-align: center;
-    overflow: hidden;
+[dir='ltr'] .search-add .search-wrap {
+    border-radius: 20px 4px 4px 20px;
 }
-
-.header button {
+[dir='rtl'] .search-add .search-wrap {
+    border-radius: 4px 20px 20px 4px;
+}
+.search-add .search-wrap.focused .tooltip {
+    display: none;
+}
+.search-add .search-wrap:last-child {
+    border-radius: 20px;
+}
+.search-add input[type='search'] {
     position: relative;
+    width: 100%;
     height: 100%;
+    border: none;
+    font-size: 14px;
+    text-indent: 25px;
+    padding: 5px 10px;
+    border-radius: inherit;
 }
-
-.field-help-title button.close,
-.sidebar-component .header button.data-editor-close,
-.sidebar-component .header button.note-editor-close,
-.sidebar-component .header button.error-editor-close,
-.entity-editor-pane .header button.preset-close,
-.preset-list-pane .header button.preset-choose {
+.search-add input[type='search'][disabled] {
+    opacity: 0.25;
+    cursor: not-allowed;
+}
+.search-add .search-icon {
+    color: #333;
+    display: block;
     position: absolute;
-    right: 0;
-    top: 0;
+    left: 10px;
+    top: 10px;
+    pointer-events: none;
 }
-[dir='rtl'] .field-help-title button.close,
-[dir='rtl'] .sidebar-component .header button.data-editor-close,
-[dir='rtl'] .sidebar-component .header button.note-editor-close,
-[dir='rtl'] .sidebar-component .header button.error-editor-close,
-[dir='rtl'] .entity-editor-pane .header button.preset-close,
-[dir='rtl'] .preset-list-pane .header button.preset-choose {
-    left: 0;
-    right: auto;
+[dir='rtl'] .search-add .search-icon {
+    left: auto;
+    right: 10px;
 }
-
-.entity-editor-pane .header button.preset-choose {
+.search-add .popover {
+    border: none;
+    border-radius: 6px;
     position: absolute;
-    left: 0;
-    top: 0;
-}
-[dir='rtl'] .entity-editor-pane .header button.preset-choose {
+    max-height: 600px;
+    top: 44px;
+    width: 200%;
+    max-width: 325px;
+    margin: auto;
     left: auto;
-    right: 0;
+    right: auto;
+    z-index: 300;
+}
+.search-add .popover .popover-content {
+    overflow-y: auto;
+    height: 100%;
+    max-height: 60vh;
+}
+.search-add .popover,
+.search-add .popover .popover-content {
+    /* ensure corners are rounded in Chrome */
+    -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
+}
+.search-add .popover .popover-footer {
+    padding: 5px 10px 5px 10px;
+    background: #f6f6f6;
+    border-top: 1px solid #DCDCDC;
+    display: flex;
+}
+.search-add .popover .popover-footer .message {
+    color: #666666;
+    flex-grow: 1;
+}
+.search-add .popover .popover-footer button.filter {
+    height: 20px;
+    background: transparent;
+    color: #666;
+}
+.search-add .popover .popover-footer button.filter.active {
+    color: #7092ff;
+}
+.search-add .popover .popover-footer button.filter:hover {
+    color: #333;
+}
+.search-add .popover .popover-footer button.filter.active:hover {
+    color: #597be7;
+}
+.search-add .popover::-webkit-scrollbar {
+    /* don't overlap rounded corners */
+    background: transparent;
+}
+.search-add .popover .list {
+    height: 100%;
+}
+.search-add .list-item > .row {
+    display: flex;
+    position: relative;
+    padding: 2px;
+}
+.search-add .list-item:not(:last-of-type) .row,
+.search-add .subsection.subitems .list-item .row,
+.search-add .subsection > .tag-reference-body  {
+    border-bottom: 1px solid #DCDCDC;
+}
+.search-add .list-item .label {
+    font-weight: bold;
+    font-size: 12px;
+    padding-left: 2px;
+    top: 0;
+    bottom: 0;
+    position: relative;
+    display: flex;
+    align-items: center;
+    line-height: 1.3em;
+    width: 100%;
+}
+.search-add .list-item .label .namepart:nth-child(2) {
+    font-weight: normal;
+}
+.search-add .list-item.disabled .preset-icon-container,
+.search-add .list-item.disabled .label {
+    opacity: 0.55;
+}
+[dir='ltr'] .search-add .list-item .label .icon.inline {
+    margin-left: 0;
+}
+[dir='rtl'] .search-add .list-item .label .icon.inline {
+    margin-right: 0;
+}
+.search-add .list-item .row > *:not(button) {
+    pointer-events: none;
+}
+.search-add .list-item button.choose {
+    position: absolute;
+    border-radius: 0;
+    height: 100%;
+    width: 100%;
+    top: 0;
+    left: 0;
+}
+.search-add .list-item button.choose:hover,
+.search-add .list-item button.choose:focus {
+    background: #fff;
+}
+.search-add .list-item.focused:not(.disabled) button.choose {
+    background: #e8ebff;
+}
+.search-add .list-item button.choose.disabled {
+    background-color: #ececec;
+}
+.search-add .subsection .list-item button.choose {
+    opacity: 0.85;
+}
+.search-add .subsection .tag-reference-body {
+    background: rgba(255, 255, 255, 0.85);
+    padding: 10px;
+}
+.search-add .list-item button.accessory {
+    position: relative;
+    flex: 0 0 auto;
+    color: #808080;
+    background: transparent;
+    padding-right: 3px;
+    padding-left: 3px;
+}
+.search-add .list-item button.accessory:hover {
+    color: #666;
+}
+.search-add .list-item button.tag-reference-open path {
+    fill: #000;
+}
+.search-add .subsection {
+    background-color: #CBCBCB;
+}
+[dir='ltr'] .search-add .subitems {
+    padding-left: 6px;
+}
+[dir='rtl'] .search-add .subitems {
+    padding-right: 6px;
+}
+
+/* Add a preset mode buttons
+------------------------------------------------------- */
+
+button.bar-button.add-preset {
+    border-radius: 4px;
+}
+[dir='ltr'] button.bar-button.add-preset {
+    margin-left: 1px;
+}
+[dir='rtl'] button.bar-button.add-preset {
+    margin-right: 1px;
+}
+[dir='ltr'] button.bar-button.add-preset.first-recent {
+    margin-left: 10px;
+}
+[dir='rtl'] button.bar-button.add-preset.first-recent {
+    margin-right: 10px;
+}
+button.bar-button.add-preset {
+    padding: 0;
+}
+button.add-preset.disabled .preset-icon-container {
+    opacity: 0.5;
+}
+/* Header for modals / panes
+------------------------------------------------------- */
+.header {
+    border-bottom: 1px solid #ccc;
+    height: 60px;
+    position: relative;
+}
+
+.header h3 {
+    text-align: center;
+    margin-bottom: 0;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    padding: 20px;
+}
+
+.header button,
+.modal > button {
+    border-radius: 0;
+    width: 40px;
+    text-align: center;
+    overflow: hidden;
+}
+
+.header button {
+    position: relative;
+    height: 100%;
+}
+
+.field-help-title button.close,
+.sidebar-component .header button.data-editor-close,
+.sidebar-component .header button.note-editor-close,
+.sidebar-component .header button.error-editor-close,
+.entity-editor-pane .header button.preset-close,
+.preset-list-pane .header button.preset-choose {
+    position: absolute;
+    right: 0;
+    top: 0;
+}
+[dir='rtl'] .field-help-title button.close,
+[dir='rtl'] .sidebar-component .header button.data-editor-close,
+[dir='rtl'] .sidebar-component .header button.note-editor-close,
+[dir='rtl'] .sidebar-component .header button.error-editor-close,
+[dir='rtl'] .entity-editor-pane .header button.preset-close,
+[dir='rtl'] .preset-list-pane .header button.preset-choose {
+    left: 0;
+    right: auto;
+}
+
+.entity-editor-pane .header button.preset-choose {
+    position: absolute;
+    left: 0;
+    top: 0;
+}
+[dir='rtl'] .entity-editor-pane .header button.preset-choose {
+    left: auto;
+    right: 0;
 }
 
 .preset-choose {
@@ -3837,169 +3975,142 @@ a.hide-toggle {
 
 .preset-list-button-wrap {
     position: relative;
-    height: 60px;
+    height: 62px;
     display: flex;
+    border: 1px solid #ccc;
+    border-radius: 4px;
 }
 
 .preset-list-button {
     width: 100%;
     height: 100%;
     position: relative;
-    border: 1px solid #ccc;
-}
-[dir='ltr'] .preset-list-button-wrap:not(.category) .preset-list-button {
-    border-top-right-radius: 0;
-    border-bottom-right-radius: 0;
-}
-[dir='rtl'] .preset-list-button-wrap:not(.category) .preset-list-button {
-    border-top-left-radius: 0;
-    border-bottom-left-radius: 0;
+    display: flex;
 }
 
 .preset-list.filtered .preset-list-item:first-child .preset-list-button {
     background: #ececec;
 }
 
+.preset-icon-container {
+    position: relative;
+    width: 60px;
+    height: 60px;
+    text-align: center;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+.preset-icon-container.small {
+    width: 40px;
+    height: 40px;
+    flex: 0 0 auto;
+}
+.preset-icon-container img.image-icon {
+    width: 50px;
+    height: 50px;
+    object-fit: contain;
+    border-radius: 2px;
+}
+
+.preset-icon-point-border path {
+    stroke: #333;
+    stroke-width: 1.2;
+    fill: transparent;
+}
+
 .preset-icon-line {
     margin: auto;
     position: absolute;
-    top: 0;
-}
-[dir='ltr'] .preset-icon-line {
     left: 0;
-}
-[dir='rtl'] .preset-icon-line {
     right: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
 }
-.preset-icon-line path.line {
+.preset-icon-container path {
     cursor: inherit;
 }
-.preset-icon-line circle.vertex {
+.preset-icon-container circle.vertex {
     fill: #fff;
     stroke: rgba(0, 0, 0, 0.25);
 }
+.preset-icon-fill circle.midpoint {
+    fill: transparent;
+    stroke: rgba(0, 0, 0, 0.25);
+}
 /* use a consistent stroke width */
-.preset-icon-line path.line.stroke {
+.preset-icon-container path.line.stroke {
     stroke-width: 2 !important;
 }
-.preset-icon-line path.line.casing {
+.preset-icon-container path.line.casing {
     stroke-width: 4 !important;
 }
 
-.preset-icon-fill-area {
-    cursor: inherit;
-    height: 40px;
-    width: 40px;
-    margin: auto;
-    position: absolute;
-    left: 10px;
-    top: 10px;
-}
-
-.preset-icon-fill-vertex {
-    height: 40px;
-    width: 40px;
+.preset-icon-fill {
     margin: auto;
     position: absolute;
-    left: 10px;
-    top: 10px;
-    border: 1.5px solid #333;
-    border-radius: 20px;
-    background-color: #efefef;
-    backface-visibility: hidden;
-}
-
-[dir='rtl'] .preset-icon-fill-vertex,
-[dir='rtl'] .preset-icon-fill-area {
-  left: auto;
-  right: 10px;
-}
-
-.preset-icon-frame {
-    position: absolute;
-    top: 7px;
-    left: 7px;
-    margin: auto;
-}
-[dir='rtl'] .preset-icon-frame {
-    left: auto;
-    right: 7px;
+    width: 100%;
+    height: 100%;
+    left: 0;
+    top: 0;
 }
-
-.preset-icon-frame .icon {
-    width: 46px;
-    height: 46px;
+.preset-icon-container svg,
+.preset-icon-container svg > * {
+    cursor: inherit !important;
 }
-
-.preset-icon-60 {
-    position: absolute;
-    top: 0px;
-    left: 0px;
-    margin: auto;
+.preset-icon-fill path.area.stroke {
+    fill: transparent;
 }
 
-.preset-icon-60 .icon {
-    width: 60px;
-    height: 60px;
+.preset-icon-fill-vertex circle {
+    stroke-width: 1.5px;
+    stroke: #333;
+    fill: #efefef;
+    backface-visibility: hidden;
 }
 
-.preset-icon-44 {
+.preset-icon {
+    width: 100%;
+    height:100%;
     position: absolute;
-    top: 9px;
-    left: 8px;
-    margin: auto;
-}
-.preset-icon-44.line-geom {
-    top: 2px;
-}
-
-.preset-icon-44 .icon {
-    width: 44px;
-    height: 44px;
+    z-index: 1;
 }
-
-.preset-icon-28 {
+.preset-icon .icon {
     position: absolute;
-    top: 16px;
-    left: 16px;
     margin: auto;
+    left: 0;
+    right: 0;
+    width: 100%;
+    height: 100%;
+    transform: scale(0.48);
 }
-
-.preset-icon-28 .icon {
-    width: 28px;
-    height: 28px;
+.preset-icon-container.small .preset-icon.point-geom .icon {
+    transform: translateY(-7%) scale(0.27);
 }
-
-.preset-icon-24 {
-    position: absolute;
-    top: 18px;
-    left: 18px;
-    margin: auto;
+.preset-icon-container.small .preset-icon.point-geom.preset-icon-iD .icon {
+    transform: translateY(-9%) scale(0.5);
 }
-.preset-icon-24.line-geom {
-    top: 12px;
+.preset-icon.framed .icon {
+    transform: scale(0.4);
 }
-
-.preset-icon-24 .icon {
-    width: 24px;
-    height: 24px;
+.preset-icon.framed.line-geom .icon,
+.preset-icon.framed.route-geom .icon {
+    top: 20%;
+    transform: translateY(-30%) scale(0.4);
 }
-
-[dir='rtl'] .preset-list-button-wrap .preset-icon {
-    left: auto;
-    right: auto;
+.preset-icon-iD .icon {
+    transform: scale(1);
 }
-
-[dir='rtl'] .preset-list-button-wrap .preset-icon-44 {
-    right: 8px;
+.preset-icon-iD.framed .icon {
+    transform: scale(0.74);
 }
-
-[dir='rtl'] .preset-list-button-wrap .preset-icon-28 {
-    right: 16px;
+.preset-icon-iD.framed.line-geom .icon,
+.preset-icon-iD.framed.route-geom .icon {
+    transform: translateY(-30%) scale(0.74);
 }
-
-[dir='rtl'] .preset-list-button-wrap .preset-icon-24 {
-    right: 18px;
+.preset-icon-container.fallback .preset-icon .icon {
+    transform: scale(0.5) !important;
 }
 
 .preset-list-button .label {
@@ -4047,37 +4158,43 @@ a.hide-toggle {
     background-color: #ececec;
 }
 
+.preset-list-item button.preset-favorite-button,
 .preset-list-item button.tag-reference-button {
     height: 100%;
-    border: 1px solid #ccc;
-    flex: 32px;
+    width: 32px;
+    flex: 0 0 auto;
     background: #f6f6f6;
 }
+[dir='ltr'] .preset-list-item button.preset-favorite-button,
 [dir='ltr'] .preset-list-item button.tag-reference-button {
-    border-left: none;
-    border-radius: 0 4px 4px 0;
+    border-left: 1px solid #ccc;
 }
+[dir='rtl'] .preset-list-item button.preset-favorite-button,
 [dir='rtl'] .preset-list-item button.tag-reference-button {
-    border-right: none;
+    border-right: 1px solid #ccc;
+}
+[dir='ltr'] .preset-list-item button:last-child {
+    border-radius: 0 4px 4px 0;
+}
+[dir='rtl'] .preset-list-item button:last-child {
     border-radius: 4px 0 0 4px;
 }
 
+.preset-list-item button.preset-favorite-button:hover,
 .preset-list-item button.tag-reference-button:hover {
     background: #f1f1f1;
 }
+.preset-list-item button.preset-favorite-button .icon,
 .preset-list-item button.tag-reference-button .icon {
     opacity: .5;
 }
 
-img.tag-reference-wiki-image {
-    float: right;
-    width: 33.3333%;
-    border-radius: 4px;
-    margin: 10px 5px 15px 10px;
+button.preset-favorite-button .icon {
+    fill-opacity: 0;
+    stroke-width: 1;
 }
-[dir='rtl'] img.tag-reference-wiki-image {
-    float: left;
-    margin: 10px 10px 15px 5px;
+button.preset-favorite-button.active .icon {
+    fill-opacity: inherit;
 }
 
 
@@ -4173,7 +4290,7 @@ img.tag-reference-wiki-image {
 /*
     The parts of a field:
     - `.form-field` is a `div` wraps the entire thing
-    - `.form-field-label` is a `label` that wraps the top part, it contains;
+    - `.field-label` is a `label` that wraps the top part, it contains;
        - `span` classed `label-text`
        - 0..n buttons for "remove", "modified", "tag reference"
     - `.form-field-input-wrap` is a `label` or `div` that wraps the bottom part, it contains;
@@ -4183,7 +4300,7 @@ img.tag-reference-wiki-image {
     - `.tag-reference-body` at the bottom (usually hidden)
 
    .------------------.                             -
-   |  Name        | i |  <- .form-field-label        |
+   |  Name        | i |  <- .field-label        |
    +------------------+                               |
    |  Starbucks   | + |  <- .form-field-input-wrap     >  .form-field
    '------------------'                               |
@@ -4208,7 +4325,7 @@ img.tag-reference-wiki-image {
 }
 
 /* A `label` element that wraps the top section */
-.form-field-label {
+.field-label {
     display: flex;
     flex-flow: row nowrap;
     flex: 1 1 100%;
@@ -4221,15 +4338,24 @@ img.tag-reference-wiki-image {
     border-radius: 4px 4px 0 0;
     overflow: hidden;
 }
-.form-field-label .label-text {
+.field-label .label-text {
     flex: 1 1 auto;
     padding: 5px 0 5px 10px;
 }
-[dir='rtl'] .form-field-label .label-text {
+[dir='rtl'] .field-label .label-text {
     padding: 5px 10px 5px 0;
 }
 
-.form-field-label button {
+.label-text .label-textannotation svg.icon {
+    margin: 0 8px;
+    color: #333;
+    opacity: 0.5;
+    width: 14px;
+    height: 14px;
+    vertical-align: text-top;
+}
+
+.field-label button {
     flex: 0 0 32px;
     border-left: 1px solid #ccc;
     width: 32px;
@@ -4237,23 +4363,25 @@ img.tag-reference-wiki-image {
     border-radius: 0;
     background: #f6f6f6;
 }
-[dir='rtl'] .form-field-label button {
+[dir='rtl'] .field-label button {
     border-left: none;
     border-right: 1px solid #ccc;
 }
-.form-field-label button:hover {
+.field-label button:hover {
     background: #f1f1f1;
 }
-.form-field-label .icon {
+.field-label .icon {
     opacity: .5;
 }
 
-.form-field-label .modified-icon,
-.form-field-label .remove-icon {
+.field-label .modified-icon,
+.field-label .remove-icon,
+.field-label .remove-icon-multilingual {
     display: none;
 }
-.modified .form-field-label .modified-icon,
-.present .form-field-label .remove-icon {
+.modified:not(.locked) .field-label .modified-icon,
+.present:not(.locked) .field-label .remove-icon,
+.present:not(.locked) .field-label .remove-icon-multilingual {
     display: inline-block;
 }
 
@@ -4261,7 +4389,8 @@ img.tag-reference-wiki-image {
 .form-field-input-wrap {
     display: flex;
     flex-flow: row nowrap;
-    flex: 1 1 100%;
+    width: 100%;
+    flex: 1 1 auto;
     min-height: 30px;
     border-top: 0;
     border-radius: 0 0 4px 4px;
@@ -4286,11 +4415,12 @@ img.tag-reference-wiki-image {
 .form-field-input-wrap > textarea {
     height: 65px;
     border-radius: 0 0 4px 4px;
+    overflow: auto;
 }
 
 /* Buttons inside fields */
 .form-field-button {
-    flex: 0 0 32px;
+    flex: 0 0 auto;
     height: 30px;
     width: 32px;
     position: relative;
@@ -4334,7 +4464,7 @@ img.tag-reference-wiki-image {
 
 /* Field - lists with labeled input items
 ------------------------------------------------------- */
-.form-field ul.labeled-inputs {
+.form-field ul.rows {
     flex: 1 1 auto;
     border: 1px solid #ccc;
     border-top: 0;
@@ -4342,32 +4472,36 @@ img.tag-reference-wiki-image {
     overflow: hidden;
     width: 100%;
 }
-.form-field ul.labeled-inputs li {
+.form-field ul.rows li {
     border-top: 1px solid #ccc;
-    display: flex;
-    flex-flow: row nowrap;
 }
-.form-field ul.labeled-inputs li:first-child {
+.form-field ul.rows li:first-child {
     border-top: 0;
 }
-.form-field ul.labeled-inputs li > span,
-.form-field ul.labeled-inputs li > div {
+.form-field ul.rows li {
+    display: flex;
+    flex-flow: row nowrap;
+}
+.form-field ul.rows li.labeled-input > span,
+.form-field ul.rows li.labeled-input > div {
     flex: 1 1 auto;
     width: 100%;
     border-radius: 0;
 }
-.form-field ul.labeled-inputs li input {
+.form-field ul.rows li input {
     border-radius: 0;
+    border-width: 0;
     width: 100%;
 }
-.form-field ul.labeled-inputs li input,
-.form-field ul.labeled-inputs li button {
+.form-field ul.rows li button {
     border-width: 0;
+}
+[dir='ltr'] .form-field ul.rows li.labeled-input input,
+[dir='ltr'] .form-field ul.rows li button {
     border-left-width: 1px;
 }
-[dir='rtl'] .form-field ul.labeled-inputs li input,
-[dir='rtl'] .form-field ul.labeled-inputs li button {
-    border-left-width: 0;
+[dir='rtl'] .form-field ul.rows li.labeled-input input,
+[dir='rtl'] .form-field ul.rows li button {
     border-right-width: 1px;
 }
 
@@ -4382,7 +4516,7 @@ img.tag-reference-wiki-image {
     border-top: 0px;
     border-radius: 0 0 4px 4px;
 }
-.structure-extras-wrap > ul.labeled-inputs {
+.structure-extras-wrap > ul.rows {
     border: 1px solid #ccc;
     border-radius: 4px;
 }
@@ -4404,35 +4538,58 @@ img.tag-reference-wiki-image {
 }
 
 .form-field-input-multicombo ul.chiplist {
-    padding: 5px 7px 5px 7px;
+    padding: 5px 10px 5px 10px;
     background: #fff;
     display: block;
     border-radius: 0 0 4px 4px;
+    width: 100%;
+}
+
+.form-field-input-multicombo li {
+    display: inline-flex;
+    flex-flow: row nowrap;
+    align-items: center;
+    margin-bottom: 3px;
+    margin-top: 3px;
+    border-radius: 4px;
+}
+[dir='ltr'] .form-field-input-multicombo li {
+    margin-right: 6px;
+}
+[dir='rtl'] .form-field-input-multicombo li {
+    margin-left: 6px;
 }
 
 .form-field-input-multicombo li.chips {
     background-color: #eff2f7;
     border: 1px solid #ccd5e3;
     line-height: 25px;
+    max-width: 100%;
+}
+[dir='ltr'] .form-field-input-multicombo li.chips {
     padding: 2px 0px 2px 5px;
 }
-.form-field-input-multicombo li {
-    display: inline-flex;
-    flex-flow: row nowrap;
-    align-items: center;
-    margin: 3px;
-    border-radius: 4px;
+[dir='rtl'] .form-field-input-multicombo li.chips {
+    padding: 2px 5px 2px 0px;
+}
+
+.form-field-input-multicombo li.chips span {
+    display: block;
+    flex: 1 1 auto;
+    overflow: hidden;
+    word-wrap: break-word;
 }
 
 .form-field-input-multicombo a {
     font-family: Arial, Helvetica, sans-serif !important;
     font-size: 16px !important;
-    line-height: 22px;
-    float: right;
     padding: 0px 5px 0px 5px;
     margin: 0;
     cursor: pointer;
     color: #a6b4ce;
+    display: block;
+    text-align: center;
+    flex: 0 0 auto;
 }
 
 .form-field-input-multicombo .input-wrap {
@@ -4450,11 +4607,8 @@ img.tag-reference-wiki-image {
     border-radius: 4px !important;
 }
 
-.form-field-input-multicombo .full-line-chips li {
-    display: block;
-}
-.form-field-input-multicombo .full-line-chips li:not(:last-child) {
-    margin-bottom: 6px;
+.form-field-input-multicombo .full-line-chips li.chips {
+    width: 100%;
 }
 .form-field-input-multicombo .full-line-chips .input-wrap {
     width: auto;
@@ -4757,10 +4911,12 @@ img.tag-reference-wiki-image {
 [dir='rtl'] .wiki-title-container > input.wiki-title {
     border-radius: 0 0 4px 0;
 }
-.wiki-title-container > button.wiki-link {
+.wiki-title-container > button.wiki-link,
+.form-field-wikidata ul.rows li:last-child button.form-field-button:last-child {
     border-radius: 0 0 4px 0;
 }
-[dir='rtl'] .wiki-title-container > button.wiki-link {
+[dir='rtl'] .wiki-title-container > button.wiki-link,
+[dir='rtl'] .form-field-wikidata ul.rows li:last-child button.form-field-button:last-child {
     border-radius: 0 0 0 4px;
 }
 
@@ -4870,7 +5026,7 @@ img.tag-reference-wiki-image {
 .form-field-comment:not(.present) #preset-input-comment {
     border-color: rgb(230, 100, 100);
 }
-.form-field-comment:not(.present) .form-field-label {
+.form-field-comment:not(.present) .field-label {
     border-color: rgb(230, 100, 100);
     background: rgba(230, 100, 100, 0.2);
 }
@@ -4917,7 +5073,7 @@ div.combobox {
     display: inline-block;
     position: relative;
     height: 30px;
-    width: 30px;
+    width: 30px !important;
     margin-left: -30px;
     vertical-align: top;
     cursor: pointer;
@@ -4938,14 +5094,6 @@ div.combobox {
     border-right: 5px solid transparent;
 }
 
-/* Remove the field's bottom border radius when combobox is open */
-/* For some reason this stops the combobox from overlapping the bottom of the field */
-.combobox + * textarea:focus,
-.combobox + * input:focus {
-    border-bottom-left-radius: 0 !important;
-    border-bottom-right-radius: 0 !important;
-}
-
 
 /* Field Help
 ------------------------------------------------------- */
@@ -5084,8 +5232,56 @@ div.combobox {
 
 /* Raw Tag Editor
 ------------------------------------------------------- */
+.raw-tag-options {
+    display: flex;
+    flex-flow: row nowrap;
+    flex-direction: row-reverse;
+    margin-top: -25px;
+    padding: 0 3px;
+}
+button.raw-tag-option {
+    flex: 0 0 20px;
+    height: 20px;
+    width: 20px;
+    background: #aaa;
+    color: #eee;
+    margin: 0 3px;
+}
+button.raw-tag-option:focus,
+button.raw-tag-option:hover,
+button.raw-tag-option.active {
+    color: #fff;
+    background: #597be7;
+}
+button.raw-tag-option.selected {
+    color: #fff;
+    background: #7092ff;
+}
+button.raw-tag-option svg.icon {
+    width: 14px;
+    height: 14px;
+    vertical-align: text-bottom;
+}
+[dir='ltr'] button.raw-tag-option-list {
+    -moz-transform: scaleX(-1);
+    -o-transform: scaleX(-1);
+    -webkit-transform: scaleX(-1);
+    transform: scaleX(-1);
+    filter: FlipH;
+    -ms-filter: "FlipH";
+}
+
+
+.tag-text {
+    width: 100%;
+    height: 100%;
+    font-family: monospace;
+    white-space: pre;
+}
+
+.tag-text,
 .tag-list {
-    padding-top: 10px;
+    margin-top: 10px;
 }
 .tag-row {
     width: 100%;
@@ -5209,17 +5405,31 @@ div.combobox {
     flex: 1 1 auto;
     width: 100%;
     overflow: hidden;
+    display: none;
+    padding-top: 10px;
 }
 .tag-reference-body.expanded {
     padding-bottom: 10px;
+    display: inline-block;
 }
 .tag-reference-description {
-    margin: 10px 5px;
+
 }
 .tag-reference-link {
     display: block;
 }
 
+img.tag-reference-wiki-image {
+    float: right;
+    width: 33.3333%;
+    border-radius: 4px;
+    margin: 0 0 0 5px;
+}
+[dir='rtl'] img.tag-reference-wiki-image {
+    float: left;
+    margin: 0 5px 0 0;
+}
+
 .preset-list .tag-reference-body {
     position: relative;
     width: 100%;
@@ -5241,10 +5451,18 @@ div.combobox {
 
 /* Raw Member / Membership Editor
 ------------------------------------------------------- */
-.raw-member-editor .member-list li:first-child,
-.raw-membership-editor .member-list li:first-child {
+
+.raw-member-editor .member-list,
+.raw-membership-editor .member-list {
     padding-top: 10px;
 }
+.raw-member-editor .member-list li,
+.raw-membership-editor .member-list li {
+    position: relative;
+    border-radius: 4px;
+    margin: 0;
+    padding-bottom: 10px;
+}
 .raw-member-editor .member-row .member-entity-name,
 .raw-membership-editor .member-row .member-entity-name {
     font-weight: normal;
@@ -5254,212 +5472,85 @@ div.combobox {
 [dir='rtl'] .raw-member-editor .member-row .member-entity-name,
 [dir='rtl'] .raw-membership-editor .member-row .member-entity-name {
     padding-left:0;
-    padding-right: 10px;
-}
-
-.form-field-input-member > input.member-role {
-    border-radius: 0 0 0 4px;
-}
-[dir='rtl'] .form-field-input-member > input.member-role {
-    border-radius: 0 0 4px 0;
-}
-
-.member-incomplete .form-field-input-member > input.member-role,
-[dir='rtl'] .member-incomplete .form-field-input-member > input.member-role {
-    border-radius: 0 0 4px 4px;
-}
-
-.member-incomplete .member-delete {
-    display: none;
-}
-
-.member-row-new .member-entity-input {
-    flex: 1 1 100%;
-    border-radius: 4px 4px 0 0;
-    border: 0;
-}
-
-/* preserve extra space at bottom of inspector to allow for dropdown options - #5280 */
-.raw-membership-editor.inspector-inner {
-    margin-bottom: 150px;
-}
-
-/* hidden field to prevent user from tabbing out of the sidebar */
-input.key-trap {
-    height: 0px;
-    width: 0px;
-    padding: 0px;
-    border: 1px solid rgba(0,0,0,0);
-}
-
-
-/* add tag, add relation buttons */
-.add-row {
-    display: flex;
-    width: 100%;
-    flex-flow: row nowrap;
-}
-.add-row .add-tag,
-.add-row .add-relation,
-.add-row .space-value {
-    flex: 1 1 50%;
-}
-.add-row .space-buttons {
-    flex: 0 0 62px;
-}
-.add-row button {
-    height: 30px;
-    background: rgba(0,0,0,.5);
-}
-.add-row button:focus,
-.add-row button:hover {
-    background: rgba(0,0,0,.8);
-}
-
-.add-tag {
-    border-radius: 0 0 4px 4px;
-}
-.add-relation {
-    margin-top: 10px;
-    border-radius: 4px;
-}
-
-
-/* Inspector (hover styles)
-------------------------------------------------------- */
-.inspector-hover .form-field-input-wrap .label,
-.inspector-hover .form-field-input-multicombo .chiplist,
-.inspector-hover .form-field-button,
-.inspector-hover .structure-extras-wrap,
-.inspector-hover .comments-container .comment,
-.inspector-hover button,
-.inspector-hover input,
-.inspector-hover textarea,
-.inspector-hover label,
-.inspector-hover .entity-issues .issue button {
-    background: #ececec;
-}
-.inspector-hover .preset-list-button,
-.inspector-hover .tag-row input {
-    background: #f6f6f6;
-}
-
-.inspector-hover .entity-issues .issue,
-.inspector-hover .entity-issues .issue li {
-    border: 1px solid #ccc;
-}
-.inspector-hover .entity-issues .issue .icon {
-    color: #666;
-}
-
-.inspector-hover a,
-.inspector-hover .form-field-input-multicombo .chips,
-.inspector-hover .form-field-input-check span {
-    color: #666;
+    padding-right: 10px;
 }
 
-.inspector-hover .form-field-input-multicombo .chips {
-    background: #eee;
-    border: 1px solid #ccc;
+.form-field-input-member > input.member-role {
+    border-radius: 0 0 0 4px;
+}
+[dir='rtl'] .form-field-input-member > input.member-role {
+    border-radius: 0 0 4px 0;
 }
 
-/* no scrollbars */
-.inspector-hover div {
-    overflow-x: hidden;
-    overflow-y: hidden;
+.member-incomplete .form-field-input-member > input.member-role,
+[dir='rtl'] .member-incomplete .form-field-input-member > input.member-role {
+    border-radius: 0 0 4px 4px;
 }
 
-/* hide and remove from layout */
-.inspector-hidden,
-.inspector-hover .preset-list-button-wrap .tag-reference-button,
-.inspector-hover label input[type="checkbox"],
-.inspector-hover label input[type="radio"],
-.inspector-hover .form-field-input-multicombo .input-wrap,
-.inspector-hover .form-field-input-radio label,
-.inspector-hover .form-field-input-radio label span,
-.inspector-hover .form-field-input-radio label.remove .icon,
-.inspector-hover .inspector-inner .add-row,
-.inspector-hover .entity-issues .issue ul.issue-fix-list {
+.member-incomplete .member-delete {
     display: none;
 }
 
-/* hide but preserve in layout */
-.inspector-hover .combobox-caret,
-.inspector-hover .header button,
-.inspector-hover .quick-links,
-.inspector-hover .form-field-input-multicombo .chips .remove,
-.inspector-hover .hide-toggle:before,
-.inspector-hover .more-fields,
-.inspector-hover .form-field-label button,
-.inspector-hover .tag-row button,
-.inspector-hover .footer * {
-    opacity: 0;
+.member-row-new .member-entity-input {
+    flex: 1 1 100%;
+    border-radius: 4px 4px 0 0;
+    border: 0;
 }
 
-/* Styles for raw tag inspector on hover */
-.inspector-hover .tag-row .key-wrap,
-.inspector-hover .tag-row .value-wrap {
-    height: 31px;
+.raw-member-editor .member-row.dragging {
+    opacity: 0.75;
+    z-index: 3000;
+    /*
+    -webkit-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.3);
+    -moz-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.3);
+    box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.3);
+    */
 }
+.raw-member-editor .member-row.dragging
 
-.inspector-hover .tag-row:first-child input.value {
-    border-top-right-radius: 4px;
-}
-[dir='rtl'] .inspector-hover .tag-row:first-child input.value {
-    border-top-right-radius: 0;
-    border-top-left-radius: 4px;
+/* preserve extra space at bottom of inspector to allow for dropdown options - #5280 */
+.raw-membership-editor.inspector-inner {
+    margin-bottom: 150px;
 }
 
-.inspector-hover .tag-row:last-child input.value {
-    border-bottom-right-radius: 4px;
-}
-[dir='rtl'] .inspector-hover .tag-row:last-child input.value {
-    border-bottom-right-radius: 0;
-    border-bottom-left-radius: 4px;
+/* hidden field to prevent user from tabbing out of the sidebar */
+input.key-trap {
+    height: 0px;
+    width: 0px;
+    padding: 0px;
+    border: 1px solid rgba(0,0,0,0);
 }
 
-.inspector-hover .tag-row:last-child input.key {
-    border-bottom-left-radius: 4px;
+
+/* add tag, add relation buttons */
+.add-row {
+    display: flex;
+    width: 100%;
+    flex-flow: row nowrap;
 }
-[dir='rtl'] .inspector-hover .tag-row:last-child input.key {
-    border-bottom-left-radius: 0;
-    border-bottom-right-radius: 4px;
+.add-row .add-tag,
+.add-row .add-relation,
+.add-row .space-value {
+    flex: 1 1 50%;
 }
-
-.inspector-hover .more-fields {
-    max-height: 0;
-    margin-bottom: -10px;
+.add-row .space-buttons {
+    flex: 0 0 62px;
 }
-
-/* Unstyle button fields */
-.inspector-hover .form-field-input-radio label.active,
-.inspector-hover .entity-editor-pane a.hide-toggle {
-    opacity: 1;
-    background-color: transparent;
-    color: #666;
-    padding-left: 0;
-    border-width: 0;
+.add-row button {
+    height: 30px;
+    background: rgba(0,0,0,.5);
 }
-.inspector-hover .form-field-input-radio button.active {
-    padding-left: 10px;
+.add-row button:focus,
+.add-row button:hover {
+    background: rgba(0,0,0,.8);
 }
 
-/* Show placeholder on hover for radio buttons */
-.inspector-hover .form-field-input-radio {
-    border: 1px solid #ccc;
-    border-top: 0;
+.add-tag {
     border-radius: 0 0 4px 4px;
 }
-.inspector-hover .form-field-input-radio .placeholder {
-    opacity: 1;
-    color: #666;
-    padding: 5px 10px;
-    line-height: 20px;
-    width: 100%;
-    border: 0;
-}
-.inspector-hover .form-field-input-radio .structure-extras-wrap {
-    border: 0;
+.add-relation {
+    margin-top: 10px;
+    border-radius: 4px;
 }
 
 
@@ -5498,6 +5589,16 @@ input.key-trap {
     position: absolute;
     top: 0px;
 }
+.preset-icon-28 {
+    position: absolute;
+    top: 16px;
+    left: 16px;
+    margin: auto;
+}
+.preset-icon-28 .icon {
+    width: 28px;
+    height: 28px;
+}
 
 .note-header-label,
 .error-header-label {
@@ -5676,7 +5777,7 @@ input.key-trap {
 ------------------------------------------------------- */
 .map-controls {
     right: 0;
-    top: 132px;
+    top: 141px;
     width: 40px;
     position: fixed;
     z-index: 100;
@@ -5845,6 +5946,13 @@ div.full-screen > button:hover {
     cursor: pointer;
 }
 
+[dir='ltr'] .layer-list .indented label {
+    padding-left: 24px;
+}
+[dir='rtl'] .layer-list .indented label {
+    padding-right: 24px;
+}
+
 .layer-list label > span {
     display: block;
     overflow: hidden;
@@ -5856,9 +5964,10 @@ div.full-screen > button:hover {
 .background-pane .layer-list button {
     float: right;
     height: 100%;
-    width: 10%;
     border-left: 1px solid #ccc;
     border-radius: 0;
+    padding-left: 4px;
+    padding-right: 4px;
 }
 [dir='rtl'] .map-data-pane .layer-list button,
 [dir='rtl'] .background-pane .layer-list button {
@@ -5894,158 +6003,341 @@ div.full-screen > button:hover {
 .issue {
     overflow: hidden;
 }
-.issue button {
-    padding: 5px 10px 5px 5px;
-    height: auto;
+.issue .issue-label,
+.issue-label .issue-text {
     width: 100%;
-    font-weight: inherit;
-    border-radius: 0;
-    text-align: inherit;
     display: flex;
-    color: inherit;
+    flex-flow: row nowrap;
+    cursor: pointer;
 }
-[dir='rtl'] .issue button {
-    padding: 5px 5px 5px 10px;
+
+.issue-text .issue-icon {
+    flex: 0 0 auto;
+    padding: 5px 7px;
 }
-.warnings-list,
-.issue.severity-warning,
- li.issue.severity-warning {
-    border-color: #FFDF5C;
+.issue-text .issue-message {
+    flex: 1 1 auto;
+    padding: 5px 0;
 }
-.icon-badge.warning {
-    color: #FFDF5C;
+.issue-label .issue-autofix {
+    flex: 0 0 auto;
+    padding: 5px 8px;
 }
-.errors-list,
-.issue.severity-error,
- li.issue.severity-error {
-    border-color: #f5b0ab;
+.issue-label .issue-info-button {
+    height: unset;
+    width: 32px;
+    flex: 0 0 auto;
+    border-left: 1px solid #ccc;
+    background-color: rgba(0,0,0,0);
 }
-.icon-badge.error {
-    color: #ff0c05;
+[dir='rtl'] .issue-label .issue-info-button {
+    border-left: 0;
+    border-right: 1px solid;
+}
+.issue-container .issue-label .issue-info-button .icon {
+    opacity: 0.5;
+}
+.issue-container.active .issue-label .issue-info-button .icon {
+    opacity: 0.7;
+}
+.issue-label .issue-info-button:last-child {
+    border-radius: 0 4px 4px 0;
+}
+[dir='rtl'] .issue-label .issue-info-button:last-child {
+    border-radius: 4px 0 0 4px;
+}
+
+button.autofix.action {
+    flex: 0 0 20px;
+    height: 20px;
+    width: 20px;
+    background: #7092ff;
+    color: #fff;
+}
+button.autofix.action:focus,
+button.autofix.action:hover,
+button.autofix.action.active {
+    background: #597be7;
+}
+
+/* fix all */
+.autofix-all {
+    display: flex;
+    flex-flow: row nowrap;
+    flex-direction: row-reverse;
+    margin-top: -25px;
+    padding-bottom: 5px;
+}
+.autofix-all-link-text {
+    padding: 0;
+}
+.autofix-all-link-icon svg {
+    margin: 0 9px;
+    background: currentColor;
+    border-radius: 4px;
+}
+.autofix-all-link-icon svg use {
+    color: #fff;
+}
+
+/* warning styles */
+.warnings-list,
+.warnings-list *,
+.issue-container.active .issue.severity-warning,
+.issue-container.active .issue.severity-warning * {
+    border-color: #fb2;
 }
 
-.issue.severity-warning,
-.issue.severity-warning button,
+.warnings-list .issue.severity-warning .issue-label,
+.issue.severity-warning .issue-fix-list,
 .mode-save .warning-section {
-    background: #ffb;
+    background: #ffc;
+}
+
+.issue-container.active .issue.severity-warning .issue-label {
+    background: #ffa;
 }
-.issue.severity-warning:not(.expanded) button:hover,
-.issue.severity-warning:not(.expanded) button:focus,
-.issue.severity-warning .issue-fix-item.actionable button:hover,
-.issue.severity-warning .issue-fix-item.actionable button:focus {
-    background: #FFFF99;
+
+.warnings-list .issue.severity-warning .issue-label:hover,
+.issue.severity-warning .issue-fix-item.actionable:hover {
+    background: #ff8;
 }
+
 .issue.severity-warning .issue-icon {
-    color: #ffa900;
-    fill: #ffa900;
+    color: #f90;
 }
-.issue.severity-warning .issue-fix-item.actionable {
+
+.issue.severity-warning .issue-fix-item.actionable,
+.issue-container.active .issue.severity-warning .issue-info-button {
     color: #b15500;
     fill: #b15500;
+    /*color: #7092ff;*/
+    /*fill: #7092ff;*/
 }
 .issue.severity-warning .issue-fix-item.actionable:hover,
-.issue.severity-warning .issue-fix-item.actionable button:focus {
+.issue-container.active .issue.severity-warning .issue-info-button:hover {
     color: #7f3d00;
     fill: #7f3d00;
+    /*color: #597be7;*/
+    /*fill: #597be7;*/
+}
+
+.notification-badge.warning {
+    color: #ffdf5c;
+}
+
+
+/* error styles */
+.errors-list,
+.errors-list *,
+.issue-container.active .issue.severity-error,
+.issue-container.active .issue.severity-error * {
+    border-color: #f77;
 }
 
-.issue.severity-error,
-.issue.severity-error button,
+.errors-list .issue.severity-error .issue-label,
+.issue.severity-error .issue-fix-list,
 .mode-save .error-section {
-    background: #FFD5D4;
+    background: #ffd6d6;
+}
+
+.issue-container.active .issue.severity-error .issue-label {
+    background: #ffc6c6;
 }
-.issue.severity-error:not(.expanded) button:hover,
-.issue.severity-error:not(.expanded) button:focus,
-.issue.severity-error .issue-fix-item.actionable button:hover,
-.issue.severity-error .issue-fix-item.actionable button:focus {
-    background: #ffc9c7;
+
+.errors-list .issue.severity-error .issue-label:hover,
+.issue.severity-error .issue-fix-item.actionable:hover {
+    background: #ffb6b6;
 }
+
 .issue.severity-error .issue-icon {
-    color: #DD1400;
-    fill: #DD1400;
+    color: #dd1400;
 }
-.issue.severity-error .issue-fix-item.actionable {
+
+.issue.severity-error .issue-fix-item.actionable,
+.issue-container.active .issue.severity-error .issue-info-button {
     color: #b91201;
     fill: #b91201;
+    /*color: #7092ff;*/
+    /*fill: #7092ff;*/
+}
+.issue.severity-error .issue-fix-item.actionable:hover,
+.issue-container.active .issue.severity-error .issue-info-button:hover {
+    color: #840c00;
+    fill: #840c00;
+    /*color: #597be7;*/
+    /*fill: #597be7;*/
+}
+
+.notification-badge.error {
+    color: #ff0c05;
+}
+
+
+/* Issues Pane */
+.issues-options-container {
+    display: table;
+}
+.issues-option {
+    display: table-row;
+}
+.issues-option-title {
+    display: table-cell;
+    font-weight: bold;
+    padding-right: 10px;
+}
+[dir='rtl'] .issues-option-title {
+    padding-right: 0;
+    padding-left: 10px;
+}
+.issues-option label {
+    display: table-cell;
+    padding: 0 10px;
+}
+
+.layer-list.issues-list li.issue {
+    border-color: inherit;    /* override .layer-list styles */
+    color: inherit;
+    height: unset;
+}
+
+.layer-list.issue-rules-list,
+.layer-list.issues-list {
+    margin-bottom: 0;
+}
+.section-footer {
+    display: flex;
+    flex-flow: row nowrap;
+    flex-direction: row-reverse;
+    height: 30px;
+}
+.section-footer a {
+    padding: 5px;
+}
+
+.issues-none .box {
+    border-radius: 4px;
+    border: 1px solid #72d979;
+    background: #c6ffca;
+    padding: 5px !important;
+    display: flex;
+}
+.issues-none .icon {
+    color: #05ac10;
+}
+
+input.square-degrees-input {
+    padding: 2px;
+    height: unset;
+    text-align: center;
+    background: rgba(0,0,0,0);
+    color: currentColor;
+}
+
+
+/* Entity Issues List */
+.entity-issues .issue-container .issue {
+    border-radius: 4px;
+    border: 1px solid #ccc;
+    background: #f6f6f6;
+}
+.entity-issues .issue-container:not(.active) .issue-text:hover,
+.entity-issues .issue-container:not(.active) .issue-info-button:hover {
+    background: #f1f1f1;
+}
+.entity-issues .issue .issue-label .issue-text {
+    padding-right: 10px;
 }
-.issue.severity-error .issue-fix-item.actionable:hover,
-.issue.severity-error .issue-fix-item.actionable button:focus {
-    color: #840c00;
-    fill: #840c00;
+[dir='rtl'] .entity-issues .issue .issue-label .issue-text {
+    padding-right: unset;
+    padding-left: 10px;
 }
 
-/* Issues Pane */
-
-.issues-list label {
-    padding: 5px;
+.entity-issues .issue-container.active .issue-label .issue-text {
+    font-weight: bold;
 }
-.issues-list label > span {
-    display: inline;
-    white-space: normal;
+.entity-issues .issue-container:not(:last-of-type) {
+    margin-bottom: 5px;
 }
-.issues-list li {
-    height: auto;
-    color: inherit;
-    position: static;
+.entity-issues .issue-container.active:not(:first-of-type) {
+    margin-top: 10px;
+}
+.entity-issues .issue-container.active:not(:last-of-type) {
+    margin-bottom: 10px;
 }
 
-.issues-none {
-    border-radius: 4px;
-    border: 1px solid #72D979;
-    background: #C6FFCA;
-    padding: 5px !important;
-    display: flex;
-    margin-top: 5px;
-    margin-bottom: 15px;
+/* fixes */
+.entity-issues .issue-fix-list {
+    border-top: 1px solid;
+    border-color: inherit;
 }
-.issues-none .icon {
-    color: #05AC10;
+.entity-issues .issue-container.active .issue-fix-list:empty {
+    display: none;
 }
 
-/* Entity Issues List */
-.entity-issues .issue {
-    border-radius: 4px;
-    border-width: 1px;
-    border-style: solid;
+li.issue-fix-item {
+    padding: 2px 10px 2px 20px;
 }
-.entity-issues .issue:not(:last-of-type) {
-    margin-bottom: 10px;
+[dir='rtl'] li.issue-fix-item {
+    padding: 2px 20px 2px 10px;
 }
-.issue.expanded button.message {
-    cursor: auto;
-    padding-bottom: 0px;
+li.issue-fix-item:first-of-type {
+    padding-top: 5px;
 }
-ul.issue-fix-list {
-    margin-bottom: 5px;
+li.issue-fix-item:last-of-type {
+    padding-bottom: 5px;
 }
-ul.issue-fix-list button {
-    padding: 2px 10px 2px 26px;
+
+li.issue-fix-item .fix-message {
+    padding: 0 10px;
 }
-.issue-fix-item:not(.actionable) button {
-    cursor: auto;
 
+li.issue-fix-item.actionable {
+    cursor: pointer;
 }
-.issue-fix-item:not(.actionable) .fix-icon {
+li.issue-fix-item:not(.actionable) .fix-icon {
     color: #555;
     fill: #555;
 }
 
-.issue:not(.expanded) ul.issue-fix-list {
+.issue-container:not(.active) ul.issue-fix-list {
     display: none;
 }
-/* don't animate right now
-.issue ul.issue-fix-list {
-    max-height: 0;
-    transition: max-height 200ms linear;
-    -moz-transition: max-height 200ms linear;
-    -webkit-transition: max-height 200ms linear;
+
+.issue-info {
+    flex: 1 1 auto;
+    width: 100%;
+    overflow: hidden;
+    display: none;
+    padding: 10px 0;
+}
+.issue-info.expanded {
+    display: inline-block;
+}
+
+.issue-info .issue-reference {
+    margin-bottom: 10px;
+}
+.issue-info .tagDiff-table {
+    min-width: 60%;
+    width: unset;
+    border: 1px solid #ccc;
+}
+.issue-info .tagDiff-row {
+    border: 1px solid #ccc;
+}
+.issue-info .tagDiff-cell {
+    padding: 2px 5px;
+    font-family: monospace;
+    font-size: 10px;
+    border: 1px solid #ccc;
+}
+.issue-info .tagDiff-cell-add {
+    background: #dfd;
+}
+.issue-info .tagDiff-cell-remove {
+    background: #fdd;
 }
-.issue.expanded ul.issue-fix-list {
-    max-height: 180px;
-    transition: max-height 200ms linear;
-    -moz-transition: max-height 200ms linear;
-    -webkit-transition: max-height 200ms linear;
-}*/
 
 
 /* Background - Display Options Sliders
@@ -6212,25 +6504,23 @@ ul.issue-fix-list button {
 
 /* Side Panes - Background / Map Data / Help
 ------------------------------------------------------- */
+.map-panes {
+    flex: 0 1 auto;
+    position: relative;
+    height: 100%;
+}
 .map-pane {
-    position: absolute;
-    top: 60px;
-    bottom: 30px;
-    right: 0;
-    width: 100%;
-    max-width: 400px;
-    min-width: 180px;
-    padding-bottom: 50px;
+    position: relative;
+    top: 0;
+    width: 400px;
+    height: 100%;
+    padding-bottom: 60px;
     overflow: hidden;
     z-index: 10;
 }
-[dir='rtl'] .map-pane {
-    left: 0;
-    right: auto !important;
-}
 
 .map-pane.help-wrap {
-    max-width: 600px;
+    width: 600px;
 }
 
 .pane-heading {
@@ -6253,12 +6543,13 @@ ul.issue-fix-list button {
 
 .pane-content {
     height: 100%;
-    padding: 10px 50px 20px 20px;
+    padding: 10px 40px 20px 20px;
     overflow-x: hidden;
     overflow-y: scroll;
+    position: relative;
 }
 [dir='rtl'] .pane-content {
-    padding: 10px 20px 20px 50px;
+    padding: 10px 20px 20px 40px;
 }
 
 .pane-content > div {
@@ -6368,6 +6659,155 @@ ul.issue-fix-list button {
 }
 
 
+/* Inspector (hover styles)
+------------------------------------------------------- */
+.inspector-hover .entity-issues .issue-container .issue .issue-label,
+.inspector-hover .form-field-input-wrap .label,
+.inspector-hover .form-field-input-multicombo .chiplist,
+.inspector-hover .form-field-button,
+.inspector-hover .structure-extras-wrap,
+.inspector-hover .comments-container .comment,
+.inspector-hover button,
+.inspector-hover input,
+.inspector-hover textarea,
+.inspector-hover label {
+    background: #ececec;
+}
+.inspector-hover .preset-list-button,
+.inspector-hover .tag-row input {
+    background: #f6f6f6;
+}
+
+.inspector-hover a,
+.inspector-hover .form-field-input-multicombo .chips,
+.inspector-hover .form-field-input-check span,
+.inspector-hover .entity-issues .issue .icon {
+    color: #666;
+}
+
+.inspector-hover .form-field-input-multicombo .chips {
+    background: #eee;
+    border: 1px solid #ccc;
+}
+
+/* no scrollbars */
+.inspector-hover div {
+    overflow-x: hidden;
+    overflow-y: hidden;
+}
+
+/* hide and remove from layout */
+.inspector-hidden,
+.inspector-hover .preset-list-button-wrap .preset-favorite-button,
+.inspector-hover .preset-list-button-wrap .tag-reference-button,
+.inspector-hover label input[type="checkbox"],
+.inspector-hover label input[type="radio"],
+.inspector-hover .form-field-input-multicombo .input-wrap,
+.inspector-hover .form-field-input-radio label,
+.inspector-hover .form-field-input-radio label span,
+.inspector-hover .form-field-input-radio label.remove .icon,
+.inspector-hover .inspector-inner .add-row,
+.inspector-hover .entity-issues .issue-container .issue-fix-list,
+.inspector-hover .entity-issues .issue-container .issue-info-button {
+    display: none;
+}
+
+/* hide but preserve in layout */
+.inspector-hover .combobox-caret,
+.inspector-hover .header button,
+.inspector-hover .quick-links,
+.inspector-hover .form-field-input-multicombo .chips .remove,
+.inspector-hover .hide-toggle:before,
+.inspector-hover .more-fields,
+.inspector-hover .field-label button,
+.inspector-hover .tag-row button,
+.inspector-hover .footer * {
+    opacity: 0;
+}
+
+/* Unstyle the active entity issue on hover */
+.inspector-hover .entity-issues .issue-container.active {
+    margin-top: 1px;
+    margin-bottom: 1px;
+}
+.inspector-hover .entity-issues .issue-container * {
+    border-color: #ccc !important;
+}
+.inspector-hover .entity-issues .issue-container.active .issue-label {
+    border-bottom: 0;
+}
+.inspector-hover .entity-issues .issue-container.active .issue-label .issue-text {
+    font-weight: normal;
+}
+
+
+/* Styles for raw tag inspector on hover */
+.inspector-hover .tag-row .key-wrap,
+.inspector-hover .tag-row .value-wrap {
+    height: 31px;
+}
+
+.inspector-hover .tag-row:first-child input.value {
+    border-top-right-radius: 4px;
+}
+[dir='rtl'] .inspector-hover .tag-row:first-child input.value {
+    border-top-right-radius: 0;
+    border-top-left-radius: 4px;
+}
+
+.inspector-hover .tag-row:last-child input.value {
+    border-bottom-right-radius: 4px;
+}
+[dir='rtl'] .inspector-hover .tag-row:last-child input.value {
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 4px;
+}
+
+.inspector-hover .tag-row:last-child input.key {
+    border-bottom-left-radius: 4px;
+}
+[dir='rtl'] .inspector-hover .tag-row:last-child input.key {
+    border-bottom-left-radius: 0;
+    border-bottom-right-radius: 4px;
+}
+
+.inspector-hover .more-fields {
+    max-height: 0;
+    margin-bottom: -10px;
+}
+
+/* Unstyle button fields */
+.inspector-hover .form-field-input-radio label.active,
+.inspector-hover .entity-editor-pane a.hide-toggle {
+    opacity: 1;
+    background-color: transparent;
+    color: #666;
+    padding-left: 0;
+    border-width: 0;
+}
+.inspector-hover .form-field-input-radio button.active {
+    padding-left: 10px;
+}
+
+/* Show placeholder on hover for radio buttons */
+.inspector-hover .form-field-input-radio {
+    border: 1px solid #ccc;
+    border-top: 0;
+    border-radius: 0 0 4px 4px;
+}
+.inspector-hover .form-field-input-radio .placeholder {
+    opacity: 1;
+    color: #666;
+    padding: 5px 10px;
+    line-height: 20px;
+    width: 100%;
+    border: 0;
+}
+.inspector-hover .form-field-input-radio .structure-extras-wrap {
+    border: 0;
+}
+
+
 /* Raster Background Tiles
 ------------------------------------------------------- */
 img.tile {
@@ -6462,7 +6902,7 @@ img.tile-debug {
 .map-in-map {
     position: absolute;
     overflow: hidden;
-    top: 60px;
+    top: 10px;
     width: 200px;
     height: 150px;
     z-index: 5;
@@ -6470,6 +6910,12 @@ img.tile-debug {
     border: #aaa 1px solid;
     box-shadow: 0 0 2em black;
 }
+[dir='ltr'] .map-in-map {
+    left: 10px;
+}
+[dir='rtl'] .map-in-map {
+    right: 10px;
+}
 
 .map-in-map-tiles {
     transform-origin: 0 0;
@@ -6554,40 +7000,55 @@ img.tile-debug {
 }
 
 
+.over-map {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 71px;
+    bottom: 30px;
+    pointer-events: none;
+    display: flex;
+    flex-direction: row-reverse;
+    align-items: flex-end;
+}
+.over-map > * {
+    pointer-events: auto;
+}
+
 /* Information Panels
 ------------------------------------------------------- */
 .info-panels {
     display: flex;
     flex-flow: row-reverse wrap-reverse;
-    position: absolute;
+    width: 100%;
     z-index: 1;
-    right: 0;
-    bottom: 30px;
     -ms-user-select: element;
+    pointer-events: none;
 }
 
-.info-panels h1,
-.info-panels h2,
-.info-panels h3,
-.info-panels h4,
-.info-panels h5 {
+.panel-container h1,
+.panel-container h2,
+.panel-container h3,
+.panel-container h4,
+.panel-container h5 {
     display: inline-block;
     margin-bottom: 0;
 }
 
-.info-panels h1,
-.info-panels h2,
-.info-panels h3 {
+.panel-container h1,
+.panel-container h2,
+.panel-container h3 {
     color: #ff8;
 }
 
 .panel-container {
     flex: 0 0 auto;
-    margin: 2px 0 0 2px;
+    margin: 0 2px 2px 0;
     border-radius: 4px;
     border: 1px solid rgba(0, 0, 0, 0.75);
     padding-bottom: 10px;
     width: 250px;
+    pointer-events: auto;
 }
 
 .panel-container .panel-title {
@@ -6648,12 +7109,9 @@ img.tile-debug {
     margin-left: auto;
     margin-right: 8px;
 }
-
-.panel-content-history .view-history-on-osm {
-    display: block;
-    margin-top: 10px;
+.panel-content-history h4 {
+    padding-bottom: 0;
 }
-
 .panel-content-location .location-info {
     margin-top: 10px;
 }
@@ -6996,6 +7454,9 @@ img.tile-debug {
     right: 0;
     margin: auto;
     z-index: 50;
+    width: 50%;
+    min-width: 200px;
+    max-width: 600px;
 }
 
 .modal .loader {
@@ -7006,7 +7467,7 @@ img.tile-debug {
 }
 
 .shaded {
-    z-index: 49;
+    z-index: 5000;
     position: absolute;
     top: 0;
     bottom: 0;
@@ -7061,7 +7522,9 @@ img.tile-debug {
 .loading-modal {
     text-align: center;
 }
-
+.modal-actions {
+    display: flex;
+}
 .modal-actions button {
     font-weight: normal;
     color: #7092ff;
@@ -7069,7 +7532,7 @@ img.tile-debug {
     border-radius: 0;
     height: 160px;
     text-align: center;
-    display: inline-block;
+    width: 100%;
 }
 .modal-actions button:hover {
     background-color: #ececec;
@@ -7245,11 +7708,11 @@ img.tile-debug {
 .modal-shortcuts .shortcut-tab {
     display: flex;
     flex-flow: row wrap;
+    justify-content: center;
 }
 
 .modal-shortcuts .shortcut-column {
-    flex: 1 1 50%;
-    width: 50%;
+    width: auto;
 }
 
 .modal-shortcuts .shortcut-tab-tools .shortcut-column {
@@ -7269,6 +7732,7 @@ img.tile-debug {
     padding: 0 10px;
     color: #767676;
     text-align: right;
+    white-space: nowrap;
 }
 [dir='rtl'] .modal-shortcuts .shortcut-keys {
     text-align: left;
@@ -7474,7 +7938,7 @@ svg.mouseclick use.right {
 ------------------------------------------------------- */
 .notice {
     position: absolute;
-    top: 45px;
+    top: 15px;
     left: 0;
     right: 0;
     text-align: center;
@@ -7518,7 +7982,7 @@ svg.mouseclick use.right {
 }
 .tooltip.in {
     opacity: 0.9;
-    z-index: 1030;
+    z-index: 5000;
     height: auto;
     display: block;
 }
@@ -7659,22 +8123,29 @@ svg.mouseclick use.right {
 }
 
 /* dark tooltips for sidebar / panels */
+.tooltip.dark.top .tooltip-arrow,
 .map-pane .tooltip.top .tooltip-arrow,
 #sidebar .tooltip.top .tooltip-arrow {
     border-top-color: #000;
 }
+.tooltip.dark.bottom .tooltip-arrow,
 .map-pane .tooltip.bottom .tooltip-arrow,
 #sidebar .tooltip.bottom .tooltip-arrow {
     border-bottom-color: #000;
 }
+.tooltip.dark.left .tooltip-arrow,
 .map-pane .tooltip.left .tooltip-arrow,
 #sidebar .tooltip.left .tooltip-arrow {
     border-left-color: #000;
 }
+.tooltip.dark.right .tooltip-arrow,
 .map-pane .tooltip.right .tooltip-arrow,
 #sidebar .tooltip.right .tooltip-arrow {
     border-right-color: #000;
 }
+.tooltip.dark .tooltip-inner,
+.tooltip.dark .tooltip-heading,
+.tooltip.dark .keyhint-wrap,
 .map-pane .tooltip-inner,
 .map-pane .tooltip-heading,
 .map-pane .keyhint-wrap,
@@ -7701,13 +8172,34 @@ svg.mouseclick use.right {
 }
 
 /* Move over tooltips that are near the edge of screen */
-button.sidebar-toggle .tooltip .tooltip-arrow {
-    left: 36px;
+[dir='ltr'] .sidebar-toggle .tooltip {
+    left: 0 !important;
+}
+[dir='rtl'] .sidebar-toggle .tooltip {
+    right: 0 !important;
+}
+[dir='ltr'] .sidebar-toggle .tooltip .tooltip-arrow {
+    left: 20px;
+}
+[dir='rtl'] .sidebar-toggle .tooltip .tooltip-arrow {
+    right: 20px;
 }
-[dir='rtl'] button.sidebar-toggle .tooltip .tooltip-arrow {
+[dir='ltr'] .save .tooltip {
+    left: auto !important;
+    right: 0 !important;
+}
+[dir='rtl'] .save .tooltip {
+    right: auto !important;
+    left: 0 !important;
+}
+[dir='ltr'] .save .tooltip .tooltip-arrow {
     left: auto;
     right: 36px;
 }
+[dir='rtl'] .save .tooltip .tooltip-arrow {
+    right: auto;
+    left: 36px;
+}
 
 li:first-of-type .badge .tooltip,
 li.hide + li.version .badge .tooltip {
@@ -7942,8 +8434,8 @@ li.hide + li.version .badge .tooltip .tooltip-arrow {
     padding: 10px 20px 0 20px;
 }
 
-[dir='rtl'] .curtain-tooltip .tooltip-inner .button-section button.col8 {
-    float: right;
+.curtain-tooltip .tooltip-inner .button-section button {
+    width: 66.6666%;
 }
 
 .curtain-tooltip .tooltip-inner .instruction:only-child {
index 08c2b96..79fd733 100644 (file)
 (function () {
-  var version = "4.13.0";
-
-  function ascending(a, b) {
-    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
-  }
-
-  function bisector(compare) {
-    if (compare.length === 1) compare = ascendingComparator(compare);
-    return {
-      left: function(a, x, lo, hi) {
-        if (lo == null) lo = 0;
-        if (hi == null) hi = a.length;
-        while (lo < hi) {
-          var mid = lo + hi >>> 1;
-          if (compare(a[mid], x) < 0) lo = mid + 1;
-          else hi = mid;
-        }
-        return lo;
-      },
-      right: function(a, x, lo, hi) {
-        if (lo == null) lo = 0;
-        if (hi == null) hi = a.length;
-        while (lo < hi) {
-          var mid = lo + hi >>> 1;
-          if (compare(a[mid], x) > 0) hi = mid;
-          else lo = mid + 1;
-        }
-        return lo;
-      }
-    };
-  }
-
-  function ascendingComparator(f) {
-    return function(d, x) {
-      return ascending(f(d), x);
-    };
-  }
-
-  var ascendingBisect = bisector(ascending);
-  var bisectRight = ascendingBisect.right;
-  var bisectLeft = ascendingBisect.left;
-
-  function pairs(array, f) {
-    if (f == null) f = pair;
-    var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
-    while (i < n) pairs[i] = f(p, p = array[++i]);
-    return pairs;
-  }
-
-  function pair(a, b) {
-    return [a, b];
-  }
-
-  function cross(values0, values1, reduce) {
-    var n0 = values0.length,
-        n1 = values1.length,
-        values = new Array(n0 * n1),
-        i0,
-        i1,
-        i,
-        value0;
-
-    if (reduce == null) reduce = pair;
-
-    for (i0 = i = 0; i0 < n0; ++i0) {
-      for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
-        values[i] = reduce(value0, values1[i1]);
-      }
-    }
-
-    return values;
-  }
-
-  function d3_descending(a, b) {
-    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
-  }
-
-  function number(x) {
-    return x === null ? NaN : +x;
-  }
-
-  function variance(values, valueof) {
-    var n = values.length,
-        m = 0,
-        i = -1,
-        mean = 0,
-        value,
-        delta,
-        sum = 0;
-
-    if (valueof == null) {
-      while (++i < n) {
-        if (!isNaN(value = number(values[i]))) {
-          delta = value - mean;
-          mean += delta / ++m;
-          sum += delta * (value - mean);
-        }
-      }
-    }
-
-    else {
-      while (++i < n) {
-        if (!isNaN(value = number(valueof(values[i], i, values)))) {
-          delta = value - mean;
-          mean += delta / ++m;
-          sum += delta * (value - mean);
-        }
-      }
-    }
-
-    if (m > 1) return sum / (m - 1);
-  }
-
-  function deviation(array, f) {
-    var v = variance(array, f);
-    return v ? Math.sqrt(v) : v;
-  }
-
-  function extent(values, valueof) {
-    var n = values.length,
-        i = -1,
-        value,
-        min,
-        max;
-
-    if (valueof == null) {
-      while (++i < n) { // Find the first comparable value.
-        if ((value = values[i]) != null && value >= value) {
-          min = max = value;
-          while (++i < n) { // Compare the remaining values.
-            if ((value = values[i]) != null) {
-              if (min > value) min = value;
-              if (max < value) max = value;
-            }
-          }
-        }
-      }
-    }
-
-    else {
-      while (++i < n) { // Find the first comparable value.
-        if ((value = valueof(values[i], i, values)) != null && value >= value) {
-          min = max = value;
-          while (++i < n) { // Compare the remaining values.
-            if ((value = valueof(values[i], i, values)) != null) {
-              if (min > value) min = value;
-              if (max < value) max = value;
-            }
-          }
-        }
-      }
-    }
-
-    return [min, max];
-  }
-
-  var array = Array.prototype;
-
-  var slice = array.slice;
-  var map = array.map;
-
-  function constant(x) {
-    return function() {
-      return x;
-    };
-  }
-
-  function identity(x) {
-    return x;
-  }
-
-  function range(start, stop, step) {
-    start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
-
-    var i = -1,
-        n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
-        range = new Array(n);
-
-    while (++i < n) {
-      range[i] = start + i * step;
-    }
-
-    return range;
-  }
-
-  var e10 = Math.sqrt(50),
-      e5 = Math.sqrt(10),
-      e2 = Math.sqrt(2);
-
-  function ticks(start, stop, count) {
-    var reverse,
-        i = -1,
-        n,
-        ticks,
-        step;
-
-    stop = +stop, start = +start, count = +count;
-    if (start === stop && count > 0) return [start];
-    if (reverse = stop < start) n = start, start = stop, stop = n;
-    if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
-
-    if (step > 0) {
-      start = Math.ceil(start / step);
-      stop = Math.floor(stop / step);
-      ticks = new Array(n = Math.ceil(stop - start + 1));
-      while (++i < n) ticks[i] = (start + i) * step;
-    } else {
-      start = Math.floor(start * step);
-      stop = Math.ceil(stop * step);
-      ticks = new Array(n = Math.ceil(start - stop + 1));
-      while (++i < n) ticks[i] = (start - i) / step;
-    }
-
-    if (reverse) ticks.reverse();
-
-    return ticks;
-  }
-
-  function tickIncrement(start, stop, count) {
-    var step = (stop - start) / Math.max(0, count),
-        power = Math.floor(Math.log(step) / Math.LN10),
-        error = step / Math.pow(10, power);
-    return power >= 0
-        ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
-        : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
-  }
-
-  function tickStep(start, stop, count) {
-    var step0 = Math.abs(stop - start) / Math.max(0, count),
-        step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
-        error = step0 / step1;
-    if (error >= e10) step1 *= 10;
-    else if (error >= e5) step1 *= 5;
-    else if (error >= e2) step1 *= 2;
-    return stop < start ? -step1 : step1;
-  }
-
-  function sturges(values) {
-    return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
-  }
-
-  function histogram() {
-    var value = identity,
-        domain = extent,
-        threshold = sturges;
-
-    function histogram(data) {
-      var i,
-          n = data.length,
-          x,
-          values = new Array(n);
-
-      for (i = 0; i < n; ++i) {
-        values[i] = value(data[i], i, data);
-      }
-
-      var xz = domain(values),
-          x0 = xz[0],
-          x1 = xz[1],
-          tz = threshold(values, x0, x1);
-
-      // Convert number of thresholds into uniform thresholds.
-      if (!Array.isArray(tz)) {
-        tz = tickStep(x0, x1, tz);
-        tz = range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive
-      }
-
-      // Remove any thresholds outside the domain.
-      var m = tz.length;
-      while (tz[0] <= x0) tz.shift(), --m;
-      while (tz[m - 1] > x1) tz.pop(), --m;
-
-      var bins = new Array(m + 1),
-          bin;
-
-      // Initialize bins.
-      for (i = 0; i <= m; ++i) {
-        bin = bins[i] = [];
-        bin.x0 = i > 0 ? tz[i - 1] : x0;
-        bin.x1 = i < m ? tz[i] : x1;
-      }
-
-      // Assign data to bins by value, ignoring any outside the domain.
-      for (i = 0; i < n; ++i) {
-        x = values[i];
-        if (x0 <= x && x <= x1) {
-          bins[bisectRight(tz, x, 0, m)].push(data[i]);
-        }
-      }
-
-      return bins;
-    }
-
-    histogram.value = function(_) {
-      return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
-    };
-
-    histogram.domain = function(_) {
-      return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
-    };
-
-    histogram.thresholds = function(_) {
-      return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
-    };
-
-    return histogram;
-  }
-
-  function quantile(values, p, valueof) {
-    if (valueof == null) valueof = number;
-    if (!(n = values.length)) return;
-    if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
-    if (p >= 1) return +valueof(values[n - 1], n - 1, values);
-    var n,
-        i = (n - 1) * p,
-        i0 = Math.floor(i),
-        value0 = +valueof(values[i0], i0, values),
-        value1 = +valueof(values[i0 + 1], i0 + 1, values);
-    return value0 + (value1 - value0) * (i - i0);
-  }
-
-  function freedmanDiaconis(values, min, max) {
-    values = map.call(values, number).sort(ascending);
-    return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));
-  }
-
-  function scott(values, min, max) {
-    return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
-  }
-
-  function max(values, valueof) {
-    var n = values.length,
-        i = -1,
-        value,
-        max;
-
-    if (valueof == null) {
-      while (++i < n) { // Find the first comparable value.
-        if ((value = values[i]) != null && value >= value) {
-          max = value;
-          while (++i < n) { // Compare the remaining values.
-            if ((value = values[i]) != null && value > max) {
-              max = value;
-            }
-          }
-        }
-      }
-    }
-
-    else {
-      while (++i < n) { // Find the first comparable value.
-        if ((value = valueof(values[i], i, values)) != null && value >= value) {
-          max = value;
-          while (++i < n) { // Compare the remaining values.
-            if ((value = valueof(values[i], i, values)) != null && value > max) {
-              max = value;
-            }
-          }
-        }
-      }
-    }
-
-    return max;
-  }
-
-  function mean(values, valueof) {
-    var n = values.length,
-        m = n,
-        i = -1,
-        value,
-        sum = 0;
-
-    if (valueof == null) {
-      while (++i < n) {
-        if (!isNaN(value = number(values[i]))) sum += value;
-        else --m;
-      }
-    }
-
-    else {
-      while (++i < n) {
-        if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
-        else --m;
-      }
-    }
-
-    if (m) return sum / m;
-  }
-
-  function d3_median(values, valueof) {
-    var n = values.length,
-        i = -1,
-        value,
-        numbers = [];
-
-    if (valueof == null) {
-      while (++i < n) {
-        if (!isNaN(value = number(values[i]))) {
-          numbers.push(value);
-        }
-      }
-    }
-
-    else {
-      while (++i < n) {
-        if (!isNaN(value = number(valueof(values[i], i, values)))) {
-          numbers.push(value);
-        }
-      }
-    }
-
-    return quantile(numbers.sort(ascending), 0.5);
-  }
-
-  function merge(arrays) {
-    var n = arrays.length,
-        m,
-        i = -1,
-        j = 0,
-        merged,
-        array;
-
-    while (++i < n) j += arrays[i].length;
-    merged = new Array(j);
-
-    while (--n >= 0) {
-      array = arrays[n];
-      m = array.length;
-      while (--m >= 0) {
-        merged[--j] = array[m];
-      }
-    }
-
-    return merged;
-  }
-
-  function min(values, valueof) {
-    var n = values.length,
-        i = -1,
-        value,
-        min;
-
-    if (valueof == null) {
-      while (++i < n) { // Find the first comparable value.
-        if ((value = values[i]) != null && value >= value) {
-          min = value;
-          while (++i < n) { // Compare the remaining values.
-            if ((value = values[i]) != null && min > value) {
-              min = value;
-            }
-          }
-        }
-      }
-    }
-
-    else {
-      while (++i < n) { // Find the first comparable value.
-        if ((value = valueof(values[i], i, values)) != null && value >= value) {
-          min = value;
-          while (++i < n) { // Compare the remaining values.
-            if ((value = valueof(values[i], i, values)) != null && min > value) {
-              min = value;
-            }
-          }
-        }
-      }
-    }
-
-    return min;
-  }
-
-  function permute(array, indexes) {
-    var i = indexes.length, permutes = new Array(i);
-    while (i--) permutes[i] = array[indexes[i]];
-    return permutes;
-  }
-
-  function scan(values, compare) {
-    if (!(n = values.length)) return;
-    var n,
-        i = 0,
-        j = 0,
-        xi,
-        xj = values[j];
-
-    if (compare == null) compare = ascending;
-
-    while (++i < n) {
-      if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
-        xj = xi, j = i;
-      }
-    }
-
-    if (compare(xj, xj) === 0) return j;
-  }
-
-  function shuffle(array, i0, i1) {
-    var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
-        t,
-        i;
-
-    while (m) {
-      i = Math.random() * m-- | 0;
-      t = array[m + i0];
-      array[m + i0] = array[i + i0];
-      array[i + i0] = t;
-    }
-
-    return array;
-  }
-
-  function sum(values, valueof) {
-    var n = values.length,
-        i = -1,
-        value,
-        sum = 0;
-
-    if (valueof == null) {
-      while (++i < n) {
-        if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
-      }
-    }
-
-    else {
-      while (++i < n) {
-        if (value = +valueof(values[i], i, values)) sum += value;
-      }
-    }
-
-    return sum;
-  }
-
-  function transpose(matrix) {
-    if (!(n = matrix.length)) return [];
-    for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
-      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
-        row[j] = matrix[j][i];
-      }
-    }
-    return transpose;
-  }
-
-  function length(d) {
-    return d.length;
-  }
-
-  function zip() {
-    return transpose(arguments);
-  }
-
-  var slice$1 = Array.prototype.slice;
-
-  function identity$1(x) {
-    return x;
-  }
-
-  var top = 1,
-      right = 2,
-      bottom = 3,
-      left = 4,
-      epsilon = 1e-6;
-
-  function translateX(x) {
-    return "translate(" + (x + 0.5) + ",0)";
-  }
-
-  function translateY(y) {
-    return "translate(0," + (y + 0.5) + ")";
-  }
-
-  function number$1(scale) {
-    return function(d) {
-      return +scale(d);
-    };
-  }
-
-  function center(scale) {
-    var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
-    if (scale.round()) offset = Math.round(offset);
-    return function(d) {
-      return +scale(d) + offset;
-    };
-  }
-
-  function entering() {
-    return !this.__axis;
-  }
-
-  function axis(orient, scale) {
-    var tickArguments = [],
-        tickValues = null,
-        tickFormat = null,
-        tickSizeInner = 6,
-        tickSizeOuter = 6,
-        tickPadding = 3,
-        k = orient === top || orient === left ? -1 : 1,
-        x = orient === left || orient === right ? "x" : "y",
-        transform = orient === top || orient === bottom ? translateX : translateY;
-
-    function axis(context) {
-      var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
-          format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
-          spacing = Math.max(tickSizeInner, 0) + tickPadding,
-          range = scale.range(),
-          range0 = +range[0] + 0.5,
-          range1 = +range[range.length - 1] + 0.5,
-          position = (scale.bandwidth ? center : number$1)(scale.copy()),
-          selection = context.selection ? context.selection() : context,
-          path = selection.selectAll(".domain").data([null]),
-          tick = selection.selectAll(".tick").data(values, scale).order(),
-          tickExit = tick.exit(),
-          tickEnter = tick.enter().append("g").attr("class", "tick"),
-          line = tick.select("line"),
-          text = tick.select("text");
-
-      path = path.merge(path.enter().insert("path", ".tick")
-          .attr("class", "domain")
-          .attr("stroke", "#000"));
-
-      tick = tick.merge(tickEnter);
-
-      line = line.merge(tickEnter.append("line")
-          .attr("stroke", "#000")
-          .attr(x + "2", k * tickSizeInner));
-
-      text = text.merge(tickEnter.append("text")
-          .attr("fill", "#000")
-          .attr(x, k * spacing)
-          .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
-
-      if (context !== selection) {
-        path = path.transition(context);
-        tick = tick.transition(context);
-        line = line.transition(context);
-        text = text.transition(context);
-
-        tickExit = tickExit.transition(context)
-            .attr("opacity", epsilon)
-            .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
-
-        tickEnter
-            .attr("opacity", epsilon)
-            .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
-      }
-
-      tickExit.remove();
-
-      path
-          .attr("d", orient === left || orient == right
-              ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
-              : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
-
-      tick
-          .attr("opacity", 1)
-          .attr("transform", function(d) { return transform(position(d)); });
-
-      line
-          .attr(x + "2", k * tickSizeInner);
-
-      text
-          .attr(x, k * spacing)
-          .text(format);
-
-      selection.filter(entering)
-          .attr("fill", "none")
-          .attr("font-size", 10)
-          .attr("font-family", "sans-serif")
-          .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
-
-      selection
-          .each(function() { this.__axis = position; });
-    }
-
-    axis.scale = function(_) {
-      return arguments.length ? (scale = _, axis) : scale;
-    };
-
-    axis.ticks = function() {
-      return tickArguments = slice$1.call(arguments), axis;
-    };
-
-    axis.tickArguments = function(_) {
-      return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
-    };
-
-    axis.tickValues = function(_) {
-      return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
-    };
-
-    axis.tickFormat = function(_) {
-      return arguments.length ? (tickFormat = _, axis) : tickFormat;
-    };
-
-    axis.tickSize = function(_) {
-      return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
-    };
-
-    axis.tickSizeInner = function(_) {
-      return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
-    };
-
-    axis.tickSizeOuter = function(_) {
-      return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
-    };
-
-    axis.tickPadding = function(_) {
-      return arguments.length ? (tickPadding = +_, axis) : tickPadding;
-    };
-
-    return axis;
-  }
-
-  function axisTop(scale) {
-    return axis(top, scale);
-  }
-
-  function axisRight(scale) {
-    return axis(right, scale);
-  }
-
-  function axisBottom(scale) {
-    return axis(bottom, scale);
-  }
-
-  function axisLeft(scale) {
-    return axis(left, scale);
-  }
-
-  var noop = {value: function() {}};
-
-  function dispatch() {
-    for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
-      if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
-      _[t] = [];
-    }
-    return new Dispatch(_);
-  }
-
-  function Dispatch(_) {
-    this._ = _;
-  }
-
-  function parseTypenames(typenames, types) {
-    return typenames.trim().split(/^|\s+/).map(function(t) {
-      var name = "", i = t.indexOf(".");
-      if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
-      if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
-      return {type: t, name: name};
-    });
-  }
-
-  Dispatch.prototype = dispatch.prototype = {
-    constructor: Dispatch,
-    on: function(typename, callback) {
-      var _ = this._,
-          T = parseTypenames(typename + "", _),
-          t,
-          i = -1,
-          n = T.length;
-
-      // If no callback was specified, return the callback of the given type and name.
-      if (arguments.length < 2) {
-        while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
-        return;
-      }
-
-      // If a type was specified, set the callback for the given type and name.
-      // Otherwise, if a null callback was specified, remove callbacks of the given name.
-      if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
-      while (++i < n) {
-        if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
-        else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
-      }
-
-      return this;
-    },
-    copy: function() {
-      var copy = {}, _ = this._;
-      for (var t in _) copy[t] = _[t].slice();
-      return new Dispatch(copy);
-    },
-    call: function(type, that) {
-      if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
-      if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
-      for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
-    },
-    apply: function(type, that, args) {
-      if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
-      for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
-    }
-  };
-
-  function get(type, name) {
-    for (var i = 0, n = type.length, c; i < n; ++i) {
-      if ((c = type[i]).name === name) {
-        return c.value;
-      }
-    }
-  }
-
-  function set(type, name, callback) {
-    for (var i = 0, n = type.length; i < n; ++i) {
-      if (type[i].name === name) {
-        type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
-        break;
-      }
-    }
-    if (callback != null) type.push({name: name, value: callback});
-    return type;
-  }
-
-  var xhtml = "http://www.w3.org/1999/xhtml";
-
-  var namespaces = {
-    svg: "http://www.w3.org/2000/svg",
-    xhtml: xhtml,
-    xlink: "http://www.w3.org/1999/xlink",
-    xml: "http://www.w3.org/XML/1998/namespace",
-    xmlns: "http://www.w3.org/2000/xmlns/"
-  };
-
-  function namespace(name) {
-    var prefix = name += "", i = prefix.indexOf(":");
-    if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
-    return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
-  }
-
-  function creatorInherit(name) {
-    return function() {
-      var document = this.ownerDocument,
-          uri = this.namespaceURI;
-      return uri === xhtml && document.documentElement.namespaceURI === xhtml
-          ? document.createElement(name)
-          : document.createElementNS(uri, name);
-    };
-  }
-
-  function creatorFixed(fullname) {
-    return function() {
-      return this.ownerDocument.createElementNS(fullname.space, fullname.local);
-    };
-  }
-
-  function creator(name) {
-    var fullname = namespace(name);
-    return (fullname.local
-        ? creatorFixed
-        : creatorInherit)(fullname);
-  }
-
-  function none() {}
-
-  function selector(selector) {
-    return selector == null ? none : function() {
-      return this.querySelector(selector);
-    };
-  }
-
-  function selection_select(select) {
-    if (typeof select !== "function") select = selector(select);
-
-    for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
-        if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
-          if ("__data__" in node) subnode.__data__ = node.__data__;
-          subgroup[i] = subnode;
-        }
-      }
-    }
-
-    return new Selection(subgroups, this._parents);
-  }
-
-  function empty() {
-    return [];
-  }
-
-  function selectorAll(selector) {
-    return selector == null ? empty : function() {
-      return this.querySelectorAll(selector);
-    };
-  }
-
-  function selection_selectAll(select) {
-    if (typeof select !== "function") select = selectorAll(select);
-
-    for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
-        if (node = group[i]) {
-          subgroups.push(select.call(node, node.__data__, i, group));
-          parents.push(node);
-        }
-      }
-    }
-
-    return new Selection(subgroups, parents);
-  }
-
-  var matcher = function(selector) {
-    return function() {
-      return this.matches(selector);
-    };
-  };
-
-  if (typeof document !== "undefined") {
-    var element = document.documentElement;
-    if (!element.matches) {
-      var vendorMatches = element.webkitMatchesSelector
-          || element.msMatchesSelector
-          || element.mozMatchesSelector
-          || element.oMatchesSelector;
-      matcher = function(selector) {
-        return function() {
-          return vendorMatches.call(this, selector);
-        };
-      };
-    }
-  }
-
-  var matcher$1 = matcher;
-
-  function selection_filter(match) {
-    if (typeof match !== "function") match = matcher$1(match);
-
-    for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
-        if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
-          subgroup.push(node);
-        }
-      }
-    }
-
-    return new Selection(subgroups, this._parents);
-  }
-
-  function sparse(update) {
-    return new Array(update.length);
-  }
-
-  function selection_enter() {
-    return new Selection(this._enter || this._groups.map(sparse), this._parents);
-  }
-
-  function EnterNode(parent, datum) {
-    this.ownerDocument = parent.ownerDocument;
-    this.namespaceURI = parent.namespaceURI;
-    this._next = null;
-    this._parent = parent;
-    this.__data__ = datum;
-  }
-
-  EnterNode.prototype = {
-    constructor: EnterNode,
-    appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
-    insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
-    querySelector: function(selector) { return this._parent.querySelector(selector); },
-    querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
-  };
-
-  function constant$1(x) {
-    return function() {
-      return x;
-    };
-  }
-
-  var keyPrefix = "$"; // Protect against keys like “__proto__”.
-
-  function bindIndex(parent, group, enter, update, exit, data) {
-    var i = 0,
-        node,
-        groupLength = group.length,
-        dataLength = data.length;
-
-    // Put any non-null nodes that fit into update.
-    // Put any null nodes into enter.
-    // Put any remaining data into enter.
-    for (; i < dataLength; ++i) {
-      if (node = group[i]) {
-        node.__data__ = data[i];
-        update[i] = node;
-      } else {
-        enter[i] = new EnterNode(parent, data[i]);
-      }
-    }
-
-    // Put any non-null nodes that don’t fit into exit.
-    for (; i < groupLength; ++i) {
-      if (node = group[i]) {
-        exit[i] = node;
-      }
-    }
-  }
-
-  function bindKey(parent, group, enter, update, exit, data, key) {
-    var i,
-        node,
-        nodeByKeyValue = {},
-        groupLength = group.length,
-        dataLength = data.length,
-        keyValues = new Array(groupLength),
-        keyValue;
-
-    // Compute the key for each node.
-    // If multiple nodes have the same key, the duplicates are added to exit.
-    for (i = 0; i < groupLength; ++i) {
-      if (node = group[i]) {
-        keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
-        if (keyValue in nodeByKeyValue) {
-          exit[i] = node;
-        } else {
-          nodeByKeyValue[keyValue] = node;
-        }
-      }
-    }
-
-    // Compute the key for each datum.
-    // If there a node associated with this key, join and add it to update.
-    // If there is not (or the key is a duplicate), add it to enter.
-    for (i = 0; i < dataLength; ++i) {
-      keyValue = keyPrefix + key.call(parent, data[i], i, data);
-      if (node = nodeByKeyValue[keyValue]) {
-        update[i] = node;
-        node.__data__ = data[i];
-        nodeByKeyValue[keyValue] = null;
-      } else {
-        enter[i] = new EnterNode(parent, data[i]);
-      }
-    }
-
-    // Add any remaining nodes that were not bound to data to exit.
-    for (i = 0; i < groupLength; ++i) {
-      if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
-        exit[i] = node;
-      }
-    }
-  }
-
-  function selection_data(value, key) {
-    if (!value) {
-      data = new Array(this.size()), j = -1;
-      this.each(function(d) { data[++j] = d; });
-      return data;
-    }
-
-    var bind = key ? bindKey : bindIndex,
-        parents = this._parents,
-        groups = this._groups;
-
-    if (typeof value !== "function") value = constant$1(value);
-
-    for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
-      var parent = parents[j],
-          group = groups[j],
-          groupLength = group.length,
-          data = value.call(parent, parent && parent.__data__, j, parents),
-          dataLength = data.length,
-          enterGroup = enter[j] = new Array(dataLength),
-          updateGroup = update[j] = new Array(dataLength),
-          exitGroup = exit[j] = new Array(groupLength);
-
-      bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
-
-      // Now connect the enter nodes to their following update node, such that
-      // appendChild can insert the materialized enter node before this node,
-      // rather than at the end of the parent node.
-      for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
-        if (previous = enterGroup[i0]) {
-          if (i0 >= i1) i1 = i0 + 1;
-          while (!(next = updateGroup[i1]) && ++i1 < dataLength);
-          previous._next = next || null;
-        }
-      }
-    }
-
-    update = new Selection(update, parents);
-    update._enter = enter;
-    update._exit = exit;
-    return update;
-  }
-
-  function selection_exit() {
-    return new Selection(this._exit || this._groups.map(sparse), this._parents);
-  }
-
-  function selection_merge(selection) {
-
-    for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
-      for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
-        if (node = group0[i] || group1[i]) {
-          merge[i] = node;
-        }
-      }
-    }
-
-    for (; j < m0; ++j) {
-      merges[j] = groups0[j];
-    }
-
-    return new Selection(merges, this._parents);
-  }
-
-  function selection_order() {
-
-    for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
-      for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
-        if (node = group[i]) {
-          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
-          next = node;
-        }
-      }
-    }
-
-    return this;
-  }
-
-  function selection_sort(compare) {
-    if (!compare) compare = ascending$1;
-
-    function compareNode(a, b) {
-      return a && b ? compare(a.__data__, b.__data__) : !a - !b;
-    }
-
-    for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
-        if (node = group[i]) {
-          sortgroup[i] = node;
-        }
-      }
-      sortgroup.sort(compareNode);
-    }
-
-    return new Selection(sortgroups, this._parents).order();
-  }
-
-  function ascending$1(a, b) {
-    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
-  }
-
-  function selection_call() {
-    var callback = arguments[0];
-    arguments[0] = this;
-    callback.apply(null, arguments);
-    return this;
-  }
-
-  function selection_nodes() {
-    var nodes = new Array(this.size()), i = -1;
-    this.each(function() { nodes[++i] = this; });
-    return nodes;
-  }
-
-  function selection_node() {
-
-    for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
-      for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
-        var node = group[i];
-        if (node) return node;
-      }
-    }
-
-    return null;
-  }
-
-  function selection_size() {
-    var size = 0;
-    this.each(function() { ++size; });
-    return size;
-  }
-
-  function selection_empty() {
-    return !this.node();
-  }
-
-  function selection_each(callback) {
-
-    for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
-      for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
-        if (node = group[i]) callback.call(node, node.__data__, i, group);
-      }
-    }
-
-    return this;
-  }
-
-  function attrRemove(name) {
-    return function() {
-      this.removeAttribute(name);
-    };
-  }
-
-  function attrRemoveNS(fullname) {
-    return function() {
-      this.removeAttributeNS(fullname.space, fullname.local);
-    };
-  }
-
-  function attrConstant(name, value) {
-    return function() {
-      this.setAttribute(name, value);
-    };
-  }
-
-  function attrConstantNS(fullname, value) {
-    return function() {
-      this.setAttributeNS(fullname.space, fullname.local, value);
-    };
-  }
-
-  function attrFunction(name, value) {
-    return function() {
-      var v = value.apply(this, arguments);
-      if (v == null) this.removeAttribute(name);
-      else this.setAttribute(name, v);
-    };
-  }
-
-  function attrFunctionNS(fullname, value) {
-    return function() {
-      var v = value.apply(this, arguments);
-      if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
-      else this.setAttributeNS(fullname.space, fullname.local, v);
-    };
-  }
-
-  function selection_attr(name, value) {
-    var fullname = namespace(name);
-
-    if (arguments.length < 2) {
-      var node = this.node();
-      return fullname.local
-          ? node.getAttributeNS(fullname.space, fullname.local)
-          : node.getAttribute(fullname);
-    }
-
-    return this.each((value == null
-        ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
-        ? (fullname.local ? attrFunctionNS : attrFunction)
-        : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
-  }
-
-  function defaultView(node) {
-    return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
-        || (node.document && node) // node is a Window
-        || node.defaultView; // node is a Document
-  }
-
-  function styleRemove(name) {
-    return function() {
-      this.style.removeProperty(name);
-    };
-  }
-
-  function styleConstant(name, value, priority) {
-    return function() {
-      this.style.setProperty(name, value, priority);
-    };
-  }
-
-  function styleFunction(name, value, priority) {
-    return function() {
-      var v = value.apply(this, arguments);
-      if (v == null) this.style.removeProperty(name);
-      else this.style.setProperty(name, v, priority);
-    };
-  }
-
-  function selection_style(name, value, priority) {
-    return arguments.length > 1
-        ? this.each((value == null
-              ? styleRemove : typeof value === "function"
-              ? styleFunction
-              : styleConstant)(name, value, priority == null ? "" : priority))
-        : styleValue(this.node(), name);
-  }
-
-  function styleValue(node, name) {
-    return node.style.getPropertyValue(name)
-        || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
-  }
-
-  function propertyRemove(name) {
-    return function() {
-      delete this[name];
-    };
-  }
-
-  function propertyConstant(name, value) {
-    return function() {
-      this[name] = value;
-    };
-  }
-
-  function propertyFunction(name, value) {
-    return function() {
-      var v = value.apply(this, arguments);
-      if (v == null) delete this[name];
-      else this[name] = v;
-    };
-  }
-
-  function selection_property(name, value) {
-    return arguments.length > 1
-        ? this.each((value == null
-            ? propertyRemove : typeof value === "function"
-            ? propertyFunction
-            : propertyConstant)(name, value))
-        : this.node()[name];
-  }
-
-  function classArray(string) {
-    return string.trim().split(/^|\s+/);
-  }
-
-  function classList(node) {
-    return node.classList || new ClassList(node);
-  }
-
-  function ClassList(node) {
-    this._node = node;
-    this._names = classArray(node.getAttribute("class") || "");
-  }
-
-  ClassList.prototype = {
-    add: function(name) {
-      var i = this._names.indexOf(name);
-      if (i < 0) {
-        this._names.push(name);
-        this._node.setAttribute("class", this._names.join(" "));
-      }
-    },
-    remove: function(name) {
-      var i = this._names.indexOf(name);
-      if (i >= 0) {
-        this._names.splice(i, 1);
-        this._node.setAttribute("class", this._names.join(" "));
-      }
-    },
-    contains: function(name) {
-      return this._names.indexOf(name) >= 0;
-    }
-  };
-
-  function classedAdd(node, names) {
-    var list = classList(node), i = -1, n = names.length;
-    while (++i < n) list.add(names[i]);
-  }
-
-  function classedRemove(node, names) {
-    var list = classList(node), i = -1, n = names.length;
-    while (++i < n) list.remove(names[i]);
-  }
-
-  function classedTrue(names) {
-    return function() {
-      classedAdd(this, names);
-    };
-  }
-
-  function classedFalse(names) {
-    return function() {
-      classedRemove(this, names);
-    };
-  }
-
-  function classedFunction(names, value) {
-    return function() {
-      (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
-    };
-  }
-
-  function selection_classed(name, value) {
-    var names = classArray(name + "");
-
-    if (arguments.length < 2) {
-      var list = classList(this.node()), i = -1, n = names.length;
-      while (++i < n) if (!list.contains(names[i])) return false;
-      return true;
-    }
-
-    return this.each((typeof value === "function"
-        ? classedFunction : value
-        ? classedTrue
-        : classedFalse)(names, value));
-  }
-
-  function textRemove() {
-    this.textContent = "";
-  }
-
-  function textConstant(value) {
-    return function() {
-      this.textContent = value;
-    };
-  }
-
-  function textFunction(value) {
-    return function() {
-      var v = value.apply(this, arguments);
-      this.textContent = v == null ? "" : v;
-    };
-  }
-
-  function selection_text(value) {
-    return arguments.length
-        ? this.each(value == null
-            ? textRemove : (typeof value === "function"
-            ? textFunction
-            : textConstant)(value))
-        : this.node().textContent;
-  }
-
-  function htmlRemove() {
-    this.innerHTML = "";
-  }
-
-  function htmlConstant(value) {
-    return function() {
-      this.innerHTML = value;
-    };
-  }
-
-  function htmlFunction(value) {
-    return function() {
-      var v = value.apply(this, arguments);
-      this.innerHTML = v == null ? "" : v;
-    };
-  }
-
-  function selection_html(value) {
-    return arguments.length
-        ? this.each(value == null
-            ? htmlRemove : (typeof value === "function"
-            ? htmlFunction
-            : htmlConstant)(value))
-        : this.node().innerHTML;
-  }
-
-  function raise() {
-    if (this.nextSibling) this.parentNode.appendChild(this);
-  }
-
-  function selection_raise() {
-    return this.each(raise);
-  }
-
-  function lower() {
-    if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
-  }
-
-  function selection_lower() {
-    return this.each(lower);
-  }
-
-  function selection_append(name) {
-    var create = typeof name === "function" ? name : creator(name);
-    return this.select(function() {
-      return this.appendChild(create.apply(this, arguments));
-    });
-  }
-
-  function constantNull() {
-    return null;
-  }
-
-  function selection_insert(name, before) {
-    var create = typeof name === "function" ? name : creator(name),
-        select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
-    return this.select(function() {
-      return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
-    });
-  }
-
-  function remove() {
-    var parent = this.parentNode;
-    if (parent) parent.removeChild(this);
-  }
-
-  function selection_remove() {
-    return this.each(remove);
-  }
-
-  function selection_cloneShallow() {
-    return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
-  }
-
-  function selection_cloneDeep() {
-    return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
-  }
-
-  function selection_clone(deep) {
-    return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
-  }
-
-  function selection_datum(value) {
-    return arguments.length
-        ? this.property("__data__", value)
-        : this.node().__data__;
-  }
-
-  var filterEvents = {};
-
-  var event = null;
-
-  if (typeof document !== "undefined") {
-    var element$1 = document.documentElement;
-    if (!("onmouseenter" in element$1)) {
-      filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
-    }
-  }
-
-  function filterContextListener(listener, index, group) {
-    listener = contextListener(listener, index, group);
-    return function(event) {
-      var related = event.relatedTarget;
-      if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
-        listener.call(this, event);
-      }
-    };
-  }
-
-  function contextListener(listener, index, group) {
-    return function(event1) {
-      var event0 = event; // Events can be reentrant (e.g., focus).
-      event = event1;
-      try {
-        listener.call(this, this.__data__, index, group);
-      } finally {
-        event = event0;
-      }
-    };
-  }
-
-  function parseTypenames$1(typenames) {
-    return typenames.trim().split(/^|\s+/).map(function(t) {
-      var name = "", i = t.indexOf(".");
-      if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
-      return {type: t, name: name};
-    });
-  }
-
-  function onRemove(typename) {
-    return function() {
-      var on = this.__on;
-      if (!on) return;
-      for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
-        if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
-          this.removeEventListener(o.type, o.listener, o.capture);
-        } else {
-          on[++i] = o;
-        }
-      }
-      if (++i) on.length = i;
-      else delete this.__on;
-    };
-  }
-
-  function onAdd(typename, value, capture) {
-    var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
-    return function(d, i, group) {
-      var on = this.__on, o, listener = wrap(value, i, group);
-      if (on) for (var j = 0, m = on.length; j < m; ++j) {
-        if ((o = on[j]).type === typename.type && o.name === typename.name) {
-          this.removeEventListener(o.type, o.listener, o.capture);
-          this.addEventListener(o.type, o.listener = listener, o.capture = capture);
-          o.value = value;
-          return;
-        }
-      }
-      this.addEventListener(typename.type, listener, capture);
-      o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
-      if (!on) this.__on = [o];
-      else on.push(o);
-    };
-  }
-
-  function selection_on(typename, value, capture) {
-    var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
-
-    if (arguments.length < 2) {
-      var on = this.node().__on;
-      if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
-        for (i = 0, o = on[j]; i < n; ++i) {
-          if ((t = typenames[i]).type === o.type && t.name === o.name) {
-            return o.value;
-          }
-        }
-      }
-      return;
-    }
-
-    on = value ? onAdd : onRemove;
-    if (capture == null) capture = false;
-    for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
-    return this;
-  }
-
-  function customEvent(event1, listener, that, args) {
-    var event0 = event;
-    event1.sourceEvent = event;
-    event = event1;
-    try {
-      return listener.apply(that, args);
-    } finally {
-      event = event0;
-    }
-  }
-
-  function dispatchEvent(node, type, params) {
-    var window = defaultView(node),
-        event = window.CustomEvent;
-
-    if (typeof event === "function") {
-      event = new event(type, params);
-    } else {
-      event = window.document.createEvent("Event");
-      if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
-      else event.initEvent(type, false, false);
-    }
-
-    node.dispatchEvent(event);
-  }
-
-  function dispatchConstant(type, params) {
-    return function() {
-      return dispatchEvent(this, type, params);
-    };
-  }
-
-  function dispatchFunction(type, params) {
-    return function() {
-      return dispatchEvent(this, type, params.apply(this, arguments));
-    };
-  }
-
-  function selection_dispatch(type, params) {
-    return this.each((typeof params === "function"
-        ? dispatchFunction
-        : dispatchConstant)(type, params));
-  }
-
-  var root = [null];
-
-  function Selection(groups, parents) {
-    this._groups = groups;
-    this._parents = parents;
-  }
-
-  function selection() {
-    return new Selection([[document.documentElement]], root);
-  }
-
-  Selection.prototype = selection.prototype = {
-    constructor: Selection,
-    select: selection_select,
-    selectAll: selection_selectAll,
-    filter: selection_filter,
-    data: selection_data,
-    enter: selection_enter,
-    exit: selection_exit,
-    merge: selection_merge,
-    order: selection_order,
-    sort: selection_sort,
-    call: selection_call,
-    nodes: selection_nodes,
-    node: selection_node,
-    size: selection_size,
-    empty: selection_empty,
-    each: selection_each,
-    attr: selection_attr,
-    style: selection_style,
-    property: selection_property,
-    classed: selection_classed,
-    text: selection_text,
-    html: selection_html,
-    raise: selection_raise,
-    lower: selection_lower,
-    append: selection_append,
-    insert: selection_insert,
-    remove: selection_remove,
-    clone: selection_clone,
-    datum: selection_datum,
-    on: selection_on,
-    dispatch: selection_dispatch
-  };
-
-  function select(selector) {
-    return typeof selector === "string"
-        ? new Selection([[document.querySelector(selector)]], [document.documentElement])
-        : new Selection([[selector]], root);
-  }
-
-  function create(name) {
-    return select(creator(name).call(document.documentElement));
-  }
-
-  var nextId = 0;
-
-  function local() {
-    return new Local;
-  }
-
-  function Local() {
-    this._ = "@" + (++nextId).toString(36);
-  }
-
-  Local.prototype = local.prototype = {
-    constructor: Local,
-    get: function(node) {
-      var id = this._;
-      while (!(id in node)) if (!(node = node.parentNode)) return;
-      return node[id];
-    },
-    set: function(node, value) {
-      return node[this._] = value;
-    },
-    remove: function(node) {
-      return this._ in node && delete node[this._];
-    },
-    toString: function() {
-      return this._;
-    }
-  };
-
-  function sourceEvent() {
-    var current = event, source;
-    while (source = current.sourceEvent) current = source;
-    return current;
-  }
-
-  function point(node, event) {
-    var svg = node.ownerSVGElement || node;
-
-    if (svg.createSVGPoint) {
-      var point = svg.createSVGPoint();
-      point.x = event.clientX, point.y = event.clientY;
-      point = point.matrixTransform(node.getScreenCTM().inverse());
-      return [point.x, point.y];
-    }
-
-    var rect = node.getBoundingClientRect();
-    return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
-  }
-
-  function mouse(node) {
-    var event = sourceEvent();
-    if (event.changedTouches) event = event.changedTouches[0];
-    return point(node, event);
-  }
-
-  function d3_selectAll(selector) {
-    return typeof selector === "string"
-        ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
-        : new Selection([selector == null ? [] : selector], root);
-  }
-
-  function touch(node, touches, identifier) {
-    if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
-
-    for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
-      if ((touch = touches[i]).identifier === identifier) {
-        return point(node, touch);
-      }
-    }
-
-    return null;
-  }
-
-  function d3_touches(node, touches) {
-    if (touches == null) touches = sourceEvent().touches;
-
-    for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
-      points[i] = point(node, touches[i]);
-    }
-
-    return points;
-  }
-
-  function nopropagation() {
-    event.stopImmediatePropagation();
-  }
-
-  function noevent() {
-    event.preventDefault();
-    event.stopImmediatePropagation();
-  }
-
-  function dragDisable(view) {
-    var root = view.document.documentElement,
-        selection = select(view).on("dragstart.drag", noevent, true);
-    if ("onselectstart" in root) {
-      selection.on("selectstart.drag", noevent, true);
-    } else {
-      root.__noselect = root.style.MozUserSelect;
-      root.style.MozUserSelect = "none";
-    }
-  }
-
-  function yesdrag(view, noclick) {
-    var root = view.document.documentElement,
-        selection = select(view).on("dragstart.drag", null);
-    if (noclick) {
-      selection.on("click.drag", noevent, true);
-      setTimeout(function() { selection.on("click.drag", null); }, 0);
-    }
-    if ("onselectstart" in root) {
-      selection.on("selectstart.drag", null);
-    } else {
-      root.style.MozUserSelect = root.__noselect;
-      delete root.__noselect;
-    }
-  }
-
-  function constant$2(x) {
-    return function() {
-      return x;
-    };
-  }
-
-  function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
-    this.target = target;
-    this.type = type;
-    this.subject = subject;
-    this.identifier = id;
-    this.active = active;
-    this.x = x;
-    this.y = y;
-    this.dx = dx;
-    this.dy = dy;
-    this._ = dispatch;
-  }
-
-  DragEvent.prototype.on = function() {
-    var value = this._.on.apply(this._, arguments);
-    return value === this._ ? this : value;
-  };
-
-  // Ignore right-click, since that should open the context menu.
-  function defaultFilter() {
-    return !event.button;
-  }
-
-  function defaultContainer() {
-    return this.parentNode;
-  }
-
-  function defaultSubject(d) {
-    return d == null ? {x: event.x, y: event.y} : d;
-  }
-
-  function defaultTouchable() {
-    return "ontouchstart" in this;
-  }
-
-  function d3_drag() {
-    var filter = defaultFilter,
-        container = defaultContainer,
-        subject = defaultSubject,
-        touchable = defaultTouchable,
-        gestures = {},
-        listeners = dispatch("start", "drag", "end"),
-        active = 0,
-        mousedownx,
-        mousedowny,
-        mousemoving,
-        touchending,
-        clickDistance2 = 0;
-
-    function drag(selection) {
-      selection
-          .on("mousedown.drag", mousedowned)
-        .filter(touchable)
-          .on("touchstart.drag", touchstarted)
-          .on("touchmove.drag", touchmoved)
-          .on("touchend.drag touchcancel.drag", touchended)
-          .style("touch-action", "none")
-          .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
-    }
-
-    function mousedowned() {
-      if (touchending || !filter.apply(this, arguments)) return;
-      var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
-      if (!gesture) return;
-      select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
-      dragDisable(event.view);
-      nopropagation();
-      mousemoving = false;
-      mousedownx = event.clientX;
-      mousedowny = event.clientY;
-      gesture("start");
-    }
-
-    function mousemoved() {
-      noevent();
-      if (!mousemoving) {
-        var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
-        mousemoving = dx * dx + dy * dy > clickDistance2;
-      }
-      gestures.mouse("drag");
-    }
-
-    function mouseupped() {
-      select(event.view).on("mousemove.drag mouseup.drag", null);
-      yesdrag(event.view, mousemoving);
-      noevent();
-      gestures.mouse("end");
-    }
-
-    function touchstarted() {
-      if (!filter.apply(this, arguments)) return;
-      var touches = event.changedTouches,
-          c = container.apply(this, arguments),
-          n = touches.length, i, gesture;
-
-      for (i = 0; i < n; ++i) {
-        if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
-          nopropagation();
-          gesture("start");
-        }
-      }
-    }
-
-    function touchmoved() {
-      var touches = event.changedTouches,
-          n = touches.length, i, gesture;
-
-      for (i = 0; i < n; ++i) {
-        if (gesture = gestures[touches[i].identifier]) {
-          noevent();
-          gesture("drag");
-        }
-      }
-    }
-
-    function touchended() {
-      var touches = event.changedTouches,
-          n = touches.length, i, gesture;
-
-      if (touchending) clearTimeout(touchending);
-      touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
-      for (i = 0; i < n; ++i) {
-        if (gesture = gestures[touches[i].identifier]) {
-          nopropagation();
-          gesture("end");
-        }
-      }
-    }
-
-    function beforestart(id, container, point, that, args) {
-      var p = point(container, id), s, dx, dy,
-          sublisteners = listeners.copy();
-
-      if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
-        if ((event.subject = s = subject.apply(that, args)) == null) return false;
-        dx = s.x - p[0] || 0;
-        dy = s.y - p[1] || 0;
-        return true;
-      })) return;
-
-      return function gesture(type) {
-        var p0 = p, n;
-        switch (type) {
-          case "start": gestures[id] = gesture, n = active++; break;
-          case "end": delete gestures[id], --active; // nobreak
-          case "drag": p = point(container, id), n = active; break;
-        }
-        customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
-      };
-    }
-
-    drag.filter = function(_) {
-      return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
-    };
-
-    drag.container = function(_) {
-      return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
-    };
-
-    drag.subject = function(_) {
-      return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
-    };
-
-    drag.touchable = function(_) {
-      return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
-    };
-
-    drag.on = function() {
-      var value = listeners.on.apply(listeners, arguments);
-      return value === listeners ? drag : value;
-    };
-
-    drag.clickDistance = function(_) {
-      return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
-    };
-
-    return drag;
-  }
-
-  function define(constructor, factory, prototype) {
-    constructor.prototype = factory.prototype = prototype;
-    prototype.constructor = constructor;
-  }
-
-  function extend(parent, definition) {
-    var prototype = Object.create(parent.prototype);
-    for (var key in definition) prototype[key] = definition[key];
-    return prototype;
-  }
-
-  function Color() {}
-
-  var darker = 0.7;
-  var brighter = 1 / darker;
-
-  var reI = "\\s*([+-]?\\d+)\\s*",
-      reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
-      reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
-      reHex3 = /^#([0-9a-f]{3})$/,
-      reHex6 = /^#([0-9a-f]{6})$/,
-      reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
-      reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
-      reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
-      reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
-      reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
-      reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
-
-  var named = {
-    aliceblue: 0xf0f8ff,
-    antiquewhite: 0xfaebd7,
-    aqua: 0x00ffff,
-    aquamarine: 0x7fffd4,
-    azure: 0xf0ffff,
-    beige: 0xf5f5dc,
-    bisque: 0xffe4c4,
-    black: 0x000000,
-    blanchedalmond: 0xffebcd,
-    blue: 0x0000ff,
-    blueviolet: 0x8a2be2,
-    brown: 0xa52a2a,
-    burlywood: 0xdeb887,
-    cadetblue: 0x5f9ea0,
-    chartreuse: 0x7fff00,
-    chocolate: 0xd2691e,
-    coral: 0xff7f50,
-    cornflowerblue: 0x6495ed,
-    cornsilk: 0xfff8dc,
-    crimson: 0xdc143c,
-    cyan: 0x00ffff,
-    darkblue: 0x00008b,
-    darkcyan: 0x008b8b,
-    darkgoldenrod: 0xb8860b,
-    darkgray: 0xa9a9a9,
-    darkgreen: 0x006400,
-    darkgrey: 0xa9a9a9,
-    darkkhaki: 0xbdb76b,
-    darkmagenta: 0x8b008b,
-    darkolivegreen: 0x556b2f,
-    darkorange: 0xff8c00,
-    darkorchid: 0x9932cc,
-    darkred: 0x8b0000,
-    darksalmon: 0xe9967a,
-    darkseagreen: 0x8fbc8f,
-    darkslateblue: 0x483d8b,
-    darkslategray: 0x2f4f4f,
-    darkslategrey: 0x2f4f4f,
-    darkturquoise: 0x00ced1,
-    darkviolet: 0x9400d3,
-    deeppink: 0xff1493,
-    deepskyblue: 0x00bfff,
-    dimgray: 0x696969,
-    dimgrey: 0x696969,
-    dodgerblue: 0x1e90ff,
-    firebrick: 0xb22222,
-    floralwhite: 0xfffaf0,
-    forestgreen: 0x228b22,
-    fuchsia: 0xff00ff,
-    gainsboro: 0xdcdcdc,
-    ghostwhite: 0xf8f8ff,
-    gold: 0xffd700,
-    goldenrod: 0xdaa520,
-    gray: 0x808080,
-    green: 0x008000,
-    greenyellow: 0xadff2f,
-    grey: 0x808080,
-    honeydew: 0xf0fff0,
-    hotpink: 0xff69b4,
-    indianred: 0xcd5c5c,
-    indigo: 0x4b0082,
-    ivory: 0xfffff0,
-    khaki: 0xf0e68c,
-    lavender: 0xe6e6fa,
-    lavenderblush: 0xfff0f5,
-    lawngreen: 0x7cfc00,
-    lemonchiffon: 0xfffacd,
-    lightblue: 0xadd8e6,
-    lightcoral: 0xf08080,
-    lightcyan: 0xe0ffff,
-    lightgoldenrodyellow: 0xfafad2,
-    lightgray: 0xd3d3d3,
-    lightgreen: 0x90ee90,
-    lightgrey: 0xd3d3d3,
-    lightpink: 0xffb6c1,
-    lightsalmon: 0xffa07a,
-    lightseagreen: 0x20b2aa,
-    lightskyblue: 0x87cefa,
-    lightslategray: 0x778899,
-    lightslategrey: 0x778899,
-    lightsteelblue: 0xb0c4de,
-    lightyellow: 0xffffe0,
-    lime: 0x00ff00,
-    limegreen: 0x32cd32,
-    linen: 0xfaf0e6,
-    magenta: 0xff00ff,
-    maroon: 0x800000,
-    mediumaquamarine: 0x66cdaa,
-    mediumblue: 0x0000cd,
-    mediumorchid: 0xba55d3,
-    mediumpurple: 0x9370db,
-    mediumseagreen: 0x3cb371,
-    mediumslateblue: 0x7b68ee,
-    mediumspringgreen: 0x00fa9a,
-    mediumturquoise: 0x48d1cc,
-    mediumvioletred: 0xc71585,
-    midnightblue: 0x191970,
-    mintcream: 0xf5fffa,
-    mistyrose: 0xffe4e1,
-    moccasin: 0xffe4b5,
-    navajowhite: 0xffdead,
-    navy: 0x000080,
-    oldlace: 0xfdf5e6,
-    olive: 0x808000,
-    olivedrab: 0x6b8e23,
-    orange: 0xffa500,
-    orangered: 0xff4500,
-    orchid: 0xda70d6,
-    palegoldenrod: 0xeee8aa,
-    palegreen: 0x98fb98,
-    paleturquoise: 0xafeeee,
-    palevioletred: 0xdb7093,
-    papayawhip: 0xffefd5,
-    peachpuff: 0xffdab9,
-    peru: 0xcd853f,
-    pink: 0xffc0cb,
-    plum: 0xdda0dd,
-    powderblue: 0xb0e0e6,
-    purple: 0x800080,
-    rebeccapurple: 0x663399,
-    red: 0xff0000,
-    rosybrown: 0xbc8f8f,
-    royalblue: 0x4169e1,
-    saddlebrown: 0x8b4513,
-    salmon: 0xfa8072,
-    sandybrown: 0xf4a460,
-    seagreen: 0x2e8b57,
-    seashell: 0xfff5ee,
-    sienna: 0xa0522d,
-    silver: 0xc0c0c0,
-    skyblue: 0x87ceeb,
-    slateblue: 0x6a5acd,
-    slategray: 0x708090,
-    slategrey: 0x708090,
-    snow: 0xfffafa,
-    springgreen: 0x00ff7f,
-    steelblue: 0x4682b4,
-    tan: 0xd2b48c,
-    teal: 0x008080,
-    thistle: 0xd8bfd8,
-    tomato: 0xff6347,
-    turquoise: 0x40e0d0,
-    violet: 0xee82ee,
-    wheat: 0xf5deb3,
-    white: 0xffffff,
-    whitesmoke: 0xf5f5f5,
-    yellow: 0xffff00,
-    yellowgreen: 0x9acd32
-  };
-
-  define(Color, color, {
-    displayable: function() {
-      return this.rgb().displayable();
-    },
-    toString: function() {
-      return this.rgb() + "";
-    }
-  });
-
-  function color(format) {
-    var m;
-    format = (format + "").trim().toLowerCase();
-    return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
-        : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
-        : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
-        : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
-        : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
-        : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
-        : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
-        : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
-        : named.hasOwnProperty(format) ? rgbn(named[format])
-        : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
-        : null;
-  }
-
-  function rgbn(n) {
-    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
-  }
-
-  function rgba(r, g, b, a) {
-    if (a <= 0) r = g = b = NaN;
-    return new Rgb(r, g, b, a);
-  }
-
-  function rgbConvert(o) {
-    if (!(o instanceof Color)) o = color(o);
-    if (!o) return new Rgb;
-    o = o.rgb();
-    return new Rgb(o.r, o.g, o.b, o.opacity);
-  }
-
-  function rgb(r, g, b, opacity) {
-    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
-  }
-
-  function Rgb(r, g, b, opacity) {
-    this.r = +r;
-    this.g = +g;
-    this.b = +b;
-    this.opacity = +opacity;
-  }
-
-  define(Rgb, rgb, extend(Color, {
-    brighter: function(k) {
-      k = k == null ? brighter : Math.pow(brighter, k);
-      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
-    },
-    darker: function(k) {
-      k = k == null ? darker : Math.pow(darker, k);
-      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
-    },
-    rgb: function() {
-      return this;
-    },
-    displayable: function() {
-      return (0 <= this.r && this.r <= 255)
-          && (0 <= this.g && this.g <= 255)
-          && (0 <= this.b && this.b <= 255)
-          && (0 <= this.opacity && this.opacity <= 1);
-    },
-    toString: function() {
-      var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
-      return (a === 1 ? "rgb(" : "rgba(")
-          + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
-          + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
-          + Math.max(0, Math.min(255, Math.round(this.b) || 0))
-          + (a === 1 ? ")" : ", " + a + ")");
-    }
-  }));
-
-  function hsla(h, s, l, a) {
-    if (a <= 0) h = s = l = NaN;
-    else if (l <= 0 || l >= 1) h = s = NaN;
-    else if (s <= 0) h = NaN;
-    return new Hsl(h, s, l, a);
-  }
-
-  function hslConvert(o) {
-    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
-    if (!(o instanceof Color)) o = color(o);
-    if (!o) return new Hsl;
-    if (o instanceof Hsl) return o;
-    o = o.rgb();
-    var r = o.r / 255,
-        g = o.g / 255,
-        b = o.b / 255,
-        min = Math.min(r, g, b),
-        max = Math.max(r, g, b),
-        h = NaN,
-        s = max - min,
-        l = (max + min) / 2;
-    if (s) {
-      if (r === max) h = (g - b) / s + (g < b) * 6;
-      else if (g === max) h = (b - r) / s + 2;
-      else h = (r - g) / s + 4;
-      s /= l < 0.5 ? max + min : 2 - max - min;
-      h *= 60;
-    } else {
-      s = l > 0 && l < 1 ? 0 : h;
-    }
-    return new Hsl(h, s, l, o.opacity);
-  }
-
-  function hsl(h, s, l, opacity) {
-    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
-  }
-
-  function Hsl(h, s, l, opacity) {
-    this.h = +h;
-    this.s = +s;
-    this.l = +l;
-    this.opacity = +opacity;
-  }
-
-  define(Hsl, hsl, extend(Color, {
-    brighter: function(k) {
-      k = k == null ? brighter : Math.pow(brighter, k);
-      return new Hsl(this.h, this.s, this.l * k, this.opacity);
-    },
-    darker: function(k) {
-      k = k == null ? darker : Math.pow(darker, k);
-      return new Hsl(this.h, this.s, this.l * k, this.opacity);
-    },
-    rgb: function() {
-      var h = this.h % 360 + (this.h < 0) * 360,
-          s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
-          l = this.l,
-          m2 = l + (l < 0.5 ? l : 1 - l) * s,
-          m1 = 2 * l - m2;
-      return new Rgb(
-        hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
-        hsl2rgb(h, m1, m2),
-        hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
-        this.opacity
-      );
-    },
-    displayable: function() {
-      return (0 <= this.s && this.s <= 1 || isNaN(this.s))
-          && (0 <= this.l && this.l <= 1)
-          && (0 <= this.opacity && this.opacity <= 1);
-    }
-  }));
-
-  /* From FvD 13.37, CSS Color Module Level 3 */
-  function hsl2rgb(h, m1, m2) {
-    return (h < 60 ? m1 + (m2 - m1) * h / 60
-        : h < 180 ? m2
-        : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
-        : m1) * 255;
-  }
-
-  var deg2rad = Math.PI / 180;
-  var rad2deg = 180 / Math.PI;
-
-  var Kn = 18,
-      Xn = 0.950470, // D65 standard referent
-      Yn = 1,
-      Zn = 1.088830,
-      t0 = 4 / 29,
-      t1 = 6 / 29,
-      t2 = 3 * t1 * t1,
-      t3 = t1 * t1 * t1;
-
-  function labConvert(o) {
-    if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
-    if (o instanceof Hcl) {
-      var h = o.h * deg2rad;
-      return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
-    }
-    if (!(o instanceof Rgb)) o = rgbConvert(o);
-    var b = rgb2xyz(o.r),
-        a = rgb2xyz(o.g),
-        l = rgb2xyz(o.b),
-        x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
-        y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
-        z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
-    return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
-  }
-
-  function lab(l, a, b, opacity) {
-    return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
-  }
-
-  function Lab(l, a, b, opacity) {
-    this.l = +l;
-    this.a = +a;
-    this.b = +b;
-    this.opacity = +opacity;
-  }
-
-  define(Lab, lab, extend(Color, {
-    brighter: function(k) {
-      return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
-    },
-    darker: function(k) {
-      return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
-    },
-    rgb: function() {
-      var y = (this.l + 16) / 116,
-          x = isNaN(this.a) ? y : y + this.a / 500,
-          z = isNaN(this.b) ? y : y - this.b / 200;
-      y = Yn * lab2xyz(y);
-      x = Xn * lab2xyz(x);
-      z = Zn * lab2xyz(z);
-      return new Rgb(
-        xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
-        xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
-        xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
-        this.opacity
-      );
-    }
-  }));
-
-  function xyz2lab(t) {
-    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
-  }
-
-  function lab2xyz(t) {
-    return t > t1 ? t * t * t : t2 * (t - t0);
-  }
-
-  function xyz2rgb(x) {
-    return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
-  }
-
-  function rgb2xyz(x) {
-    return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
-  }
-
-  function hclConvert(o) {
-    if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
-    if (!(o instanceof Lab)) o = labConvert(o);
-    var h = Math.atan2(o.b, o.a) * rad2deg;
-    return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
-  }
-
-  function hcl(h, c, l, opacity) {
-    return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
-  }
-
-  function Hcl(h, c, l, opacity) {
-    this.h = +h;
-    this.c = +c;
-    this.l = +l;
-    this.opacity = +opacity;
-  }
-
-  define(Hcl, hcl, extend(Color, {
-    brighter: function(k) {
-      return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
-    },
-    darker: function(k) {
-      return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
-    },
-    rgb: function() {
-      return labConvert(this).rgb();
-    }
-  }));
-
-  var A = -0.14861,
-      B = +1.78277,
-      C = -0.29227,
-      D = -0.90649,
-      E = +1.97294,
-      ED = E * D,
-      EB = E * B,
-      BC_DA = B * C - D * A;
-
-  function cubehelixConvert(o) {
-    if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
-    if (!(o instanceof Rgb)) o = rgbConvert(o);
-    var r = o.r / 255,
-        g = o.g / 255,
-        b = o.b / 255,
-        l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
-        bl = b - l,
-        k = (E * (g - l) - C * bl) / D,
-        s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
-        h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
-    return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
-  }
-
-  function cubehelix(h, s, l, opacity) {
-    return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
-  }
-
-  function Cubehelix(h, s, l, opacity) {
-    this.h = +h;
-    this.s = +s;
-    this.l = +l;
-    this.opacity = +opacity;
-  }
-
-  define(Cubehelix, cubehelix, extend(Color, {
-    brighter: function(k) {
-      k = k == null ? brighter : Math.pow(brighter, k);
-      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
-    },
-    darker: function(k) {
-      k = k == null ? darker : Math.pow(darker, k);
-      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
-    },
-    rgb: function() {
-      var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
-          l = +this.l,
-          a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
-          cosh = Math.cos(h),
-          sinh = Math.sin(h);
-      return new Rgb(
-        255 * (l + a * (A * cosh + B * sinh)),
-        255 * (l + a * (C * cosh + D * sinh)),
-        255 * (l + a * (E * cosh)),
-        this.opacity
-      );
-    }
-  }));
-
-  function basis(t1, v0, v1, v2, v3) {
-    var t2 = t1 * t1, t3 = t2 * t1;
-    return ((1 - 3 * t1 + 3 * t2 - t3) * v0
-        + (4 - 6 * t2 + 3 * t3) * v1
-        + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
-        + t3 * v3) / 6;
-  }
-
-  function basis$1(values) {
-    var n = values.length - 1;
-    return function(t) {
-      var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
-          v1 = values[i],
-          v2 = values[i + 1],
-          v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
-          v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
-      return basis((t - i / n) * n, v0, v1, v2, v3);
-    };
-  }
-
-  function basisClosed(values) {
-    var n = values.length;
-    return function(t) {
-      var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
-          v0 = values[(i + n - 1) % n],
-          v1 = values[i % n],
-          v2 = values[(i + 1) % n],
-          v3 = values[(i + 2) % n];
-      return basis((t - i / n) * n, v0, v1, v2, v3);
-    };
-  }
-
-  function constant$3(x) {
-    return function() {
-      return x;
-    };
-  }
-
-  function linear(a, d) {
-    return function(t) {
-      return a + t * d;
-    };
-  }
-
-  function exponential(a, b, y) {
-    return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
-      return Math.pow(a + t * b, y);
-    };
-  }
-
-  function hue(a, b) {
-    var d = b - a;
-    return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
-  }
-
-  function gamma(y) {
-    return (y = +y) === 1 ? nogamma : function(a, b) {
-      return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
-    };
-  }
-
-  function nogamma(a, b) {
-    var d = b - a;
-    return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
-  }
-
-  var interpolateRgb = (function rgbGamma(y) {
-    var color = gamma(y);
-
-    function rgb$1(start, end) {
-      var r = color((start = rgb(start)).r, (end = rgb(end)).r),
-          g = color(start.g, end.g),
-          b = color(start.b, end.b),
-          opacity = nogamma(start.opacity, end.opacity);
-      return function(t) {
-        start.r = r(t);
-        start.g = g(t);
-        start.b = b(t);
-        start.opacity = opacity(t);
-        return start + "";
-      };
-    }
-
-    rgb$1.gamma = rgbGamma;
-
-    return rgb$1;
-  })(1);
-
-  function rgbSpline(spline) {
-    return function(colors) {
-      var n = colors.length,
-          r = new Array(n),
-          g = new Array(n),
-          b = new Array(n),
-          i, color;
-      for (i = 0; i < n; ++i) {
-        color = rgb(colors[i]);
-        r[i] = color.r || 0;
-        g[i] = color.g || 0;
-        b[i] = color.b || 0;
-      }
-      r = spline(r);
-      g = spline(g);
-      b = spline(b);
-      color.opacity = 1;
-      return function(t) {
-        color.r = r(t);
-        color.g = g(t);
-        color.b = b(t);
-        return color + "";
-      };
-    };
-  }
-
-  var rgbBasis = rgbSpline(basis$1);
-  var rgbBasisClosed = rgbSpline(basisClosed);
-
-  function array$1(a, b) {
-    var nb = b ? b.length : 0,
-        na = a ? Math.min(nb, a.length) : 0,
-        x = new Array(na),
-        c = new Array(nb),
-        i;
-
-    for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
-    for (; i < nb; ++i) c[i] = b[i];
-
-    return function(t) {
-      for (i = 0; i < na; ++i) c[i] = x[i](t);
-      return c;
-    };
-  }
-
-  function date(a, b) {
-    var d = new Date;
-    return a = +a, b -= a, function(t) {
-      return d.setTime(a + b * t), d;
-    };
-  }
-
-  function interpolateNumber(a, b) {
-    return a = +a, b -= a, function(t) {
-      return a + b * t;
-    };
-  }
-
-  function object(a, b) {
-    var i = {},
-        c = {},
-        k;
-
-    if (a === null || typeof a !== "object") a = {};
-    if (b === null || typeof b !== "object") b = {};
-
-    for (k in b) {
-      if (k in a) {
-        i[k] = interpolate(a[k], b[k]);
-      } else {
-        c[k] = b[k];
-      }
-    }
-
-    return function(t) {
-      for (k in i) c[k] = i[k](t);
-      return c;
-    };
-  }
-
-  var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
-      reB = new RegExp(reA.source, "g");
-
-  function zero(b) {
-    return function() {
-      return b;
-    };
-  }
-
-  function one(b) {
-    return function(t) {
-      return b(t) + "";
-    };
-  }
-
-  function interpolateString(a, b) {
-    var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
-        am, // current match in a
-        bm, // current match in b
-        bs, // string preceding current number in b, if any
-        i = -1, // index in s
-        s = [], // string constants and placeholders
-        q = []; // number interpolators
-
-    // Coerce inputs to strings.
-    a = a + "", b = b + "";
-
-    // Interpolate pairs of numbers in a & b.
-    while ((am = reA.exec(a))
-        && (bm = reB.exec(b))) {
-      if ((bs = bm.index) > bi) { // a string precedes the next number in b
-        bs = b.slice(bi, bs);
-        if (s[i]) s[i] += bs; // coalesce with previous string
-        else s[++i] = bs;
-      }
-      if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
-        if (s[i]) s[i] += bm; // coalesce with previous string
-        else s[++i] = bm;
-      } else { // interpolate non-matching numbers
-        s[++i] = null;
-        q.push({i: i, x: interpolateNumber(am, bm)});
-      }
-      bi = reB.lastIndex;
-    }
-
-    // Add remains of b.
-    if (bi < b.length) {
-      bs = b.slice(bi);
-      if (s[i]) s[i] += bs; // coalesce with previous string
-      else s[++i] = bs;
-    }
-
-    // Special optimization for only a single match.
-    // Otherwise, interpolate each of the numbers and rejoin the string.
-    return s.length < 2 ? (q[0]
-        ? one(q[0].x)
-        : zero(b))
-        : (b = q.length, function(t) {
-            for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
-            return s.join("");
-          });
-  }
-
-  function interpolate(a, b) {
-    var t = typeof b, c;
-    return b == null || t === "boolean" ? constant$3(b)
-        : (t === "number" ? interpolateNumber
-        : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
-        : b instanceof color ? interpolateRgb
-        : b instanceof Date ? date
-        : Array.isArray(b) ? array$1
-        : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
-        : interpolateNumber)(a, b);
-  }
-
-  function interpolateRound(a, b) {
-    return a = +a, b -= a, function(t) {
-      return Math.round(a + b * t);
-    };
-  }
-
-  var degrees = 180 / Math.PI;
-
-  var identity$2 = {
-    translateX: 0,
-    translateY: 0,
-    rotate: 0,
-    skewX: 0,
-    scaleX: 1,
-    scaleY: 1
-  };
-
-  function decompose(a, b, c, d, e, f) {
-    var scaleX, scaleY, skewX;
-    if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
-    if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
-    if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
-    if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
-    return {
-      translateX: e,
-      translateY: f,
-      rotate: Math.atan2(b, a) * degrees,
-      skewX: Math.atan(skewX) * degrees,
-      scaleX: scaleX,
-      scaleY: scaleY
-    };
-  }
-
-  var cssNode,
-      cssRoot,
-      cssView,
-      svgNode;
-
-  function parseCss(value) {
-    if (value === "none") return identity$2;
-    if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
-    cssNode.style.transform = value;
-    value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
-    cssRoot.removeChild(cssNode);
-    value = value.slice(7, -1).split(",");
-    return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
-  }
-
-  function parseSvg(value) {
-    if (value == null) return identity$2;
-    if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
-    svgNode.setAttribute("transform", value);
-    if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
-    value = value.matrix;
-    return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
-  }
-
-  function interpolateTransform(parse, pxComma, pxParen, degParen) {
-
-    function pop(s) {
-      return s.length ? s.pop() + " " : "";
-    }
-
-    function translate(xa, ya, xb, yb, s, q) {
-      if (xa !== xb || ya !== yb) {
-        var i = s.push("translate(", null, pxComma, null, pxParen);
-        q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
-      } else if (xb || yb) {
-        s.push("translate(" + xb + pxComma + yb + pxParen);
-      }
-    }
-
-    function rotate(a, b, s, q) {
-      if (a !== b) {
-        if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
-        q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)});
-      } else if (b) {
-        s.push(pop(s) + "rotate(" + b + degParen);
-      }
-    }
-
-    function skewX(a, b, s, q) {
-      if (a !== b) {
-        q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
-      } else if (b) {
-        s.push(pop(s) + "skewX(" + b + degParen);
-      }
-    }
-
-    function scale(xa, ya, xb, yb, s, q) {
-      if (xa !== xb || ya !== yb) {
-        var i = s.push(pop(s) + "scale(", null, ",", null, ")");
-        q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
-      } else if (xb !== 1 || yb !== 1) {
-        s.push(pop(s) + "scale(" + xb + "," + yb + ")");
-      }
-    }
-
-    return function(a, b) {
-      var s = [], // string constants and placeholders
-          q = []; // number interpolators
-      a = parse(a), b = parse(b);
-      translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
-      rotate(a.rotate, b.rotate, s, q);
-      skewX(a.skewX, b.skewX, s, q);
-      scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
-      a = b = null; // gc
-      return function(t) {
-        var i = -1, n = q.length, o;
-        while (++i < n) s[(o = q[i]).i] = o.x(t);
-        return s.join("");
-      };
-    };
-  }
-
-  var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
-  var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
-
-  var rho = Math.SQRT2,
-      rho2 = 2,
-      rho4 = 4,
-      epsilon2 = 1e-12;
-
-  function cosh(x) {
-    return ((x = Math.exp(x)) + 1 / x) / 2;
-  }
-
-  function sinh(x) {
-    return ((x = Math.exp(x)) - 1 / x) / 2;
-  }
-
-  function tanh(x) {
-    return ((x = Math.exp(2 * x)) - 1) / (x + 1);
-  }
-
-  // p0 = [ux0, uy0, w0]
-  // p1 = [ux1, uy1, w1]
-  function interpolateZoom(p0, p1) {
-    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
-        ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
-        dx = ux1 - ux0,
-        dy = uy1 - uy0,
-        d2 = dx * dx + dy * dy,
-        i,
-        S;
-
-    // Special case for u0 ≅ u1.
-    if (d2 < epsilon2) {
-      S = Math.log(w1 / w0) / rho;
-      i = function(t) {
-        return [
-          ux0 + t * dx,
-          uy0 + t * dy,
-          w0 * Math.exp(rho * t * S)
-        ];
-      };
-    }
-
-    // General case.
-    else {
-      var d1 = Math.sqrt(d2),
-          b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
-          b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
-          r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
-          r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
-      S = (r1 - r0) / rho;
-      i = function(t) {
-        var s = t * S,
-            coshr0 = cosh(r0),
-            u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
-        return [
-          ux0 + u * dx,
-          uy0 + u * dy,
-          w0 * coshr0 / cosh(rho * s + r0)
-        ];
-      };
-    }
-
-    i.duration = S * 1000;
-
-    return i;
-  }
-
-  function hsl$1(hue) {
-    return function(start, end) {
-      var h = hue((start = hsl(start)).h, (end = hsl(end)).h),
-          s = nogamma(start.s, end.s),
-          l = nogamma(start.l, end.l),
-          opacity = nogamma(start.opacity, end.opacity);
-      return function(t) {
-        start.h = h(t);
-        start.s = s(t);
-        start.l = l(t);
-        start.opacity = opacity(t);
-        return start + "";
-      };
-    }
-  }
-
-  var hsl$2 = hsl$1(hue);
-  var hslLong = hsl$1(nogamma);
-
-  function lab$1(start, end) {
-    var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
-        a = nogamma(start.a, end.a),
-        b = nogamma(start.b, end.b),
-        opacity = nogamma(start.opacity, end.opacity);
-    return function(t) {
-      start.l = l(t);
-      start.a = a(t);
-      start.b = b(t);
-      start.opacity = opacity(t);
-      return start + "";
-    };
-  }
-
-  function hcl$1(hue) {
-    return function(start, end) {
-      var h = hue((start = hcl(start)).h, (end = hcl(end)).h),
-          c = nogamma(start.c, end.c),
-          l = nogamma(start.l, end.l),
-          opacity = nogamma(start.opacity, end.opacity);
-      return function(t) {
-        start.h = h(t);
-        start.c = c(t);
-        start.l = l(t);
-        start.opacity = opacity(t);
-        return start + "";
-      };
-    }
-  }
-
-  var hcl$2 = hcl$1(hue);
-  var hclLong = hcl$1(nogamma);
-
-  function cubehelix$1(hue) {
-    return (function cubehelixGamma(y) {
-      y = +y;
-
-      function cubehelix$1(start, end) {
-        var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
-            s = nogamma(start.s, end.s),
-            l = nogamma(start.l, end.l),
-            opacity = nogamma(start.opacity, end.opacity);
-        return function(t) {
-          start.h = h(t);
-          start.s = s(t);
-          start.l = l(Math.pow(t, y));
-          start.opacity = opacity(t);
-          return start + "";
-        };
-      }
-
-      cubehelix$1.gamma = cubehelixGamma;
-
-      return cubehelix$1;
-    })(1);
-  }
-
-  var cubehelix$2 = cubehelix$1(hue);
-  var cubehelixLong = cubehelix$1(nogamma);
-
-  function d3_quantize(interpolator, n) {
-    var samples = new Array(n);
-    for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
-    return samples;
-  }
-
-  var frame = 0, // is an animation frame pending?
-      timeout = 0, // is a timeout pending?
-      interval = 0, // are any timers active?
-      pokeDelay = 1000, // how frequently we check for clock skew
-      taskHead,
-      taskTail,
-      clockLast = 0,
-      clockNow = 0,
-      clockSkew = 0,
-      clock = typeof performance === "object" && performance.now ? performance : Date,
-      setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
-
-  function now() {
-    return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
-  }
-
-  function clearNow() {
-    clockNow = 0;
-  }
-
-  function Timer() {
-    this._call =
-    this._time =
-    this._next = null;
-  }
-
-  Timer.prototype = timer.prototype = {
-    constructor: Timer,
-    restart: function(callback, delay, time) {
-      if (typeof callback !== "function") throw new TypeError("callback is not a function");
-      time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
-      if (!this._next && taskTail !== this) {
-        if (taskTail) taskTail._next = this;
-        else taskHead = this;
-        taskTail = this;
-      }
-      this._call = callback;
-      this._time = time;
-      sleep();
-    },
-    stop: function() {
-      if (this._call) {
-        this._call = null;
-        this._time = Infinity;
-        sleep();
-      }
-    }
-  };
-
-  function timer(callback, delay, time) {
-    var t = new Timer;
-    t.restart(callback, delay, time);
-    return t;
-  }
-
-  function timerFlush() {
-    now(); // Get the current time, if not already set.
-    ++frame; // Pretend we’ve set an alarm, if we haven’t already.
-    var t = taskHead, e;
-    while (t) {
-      if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
-      t = t._next;
-    }
-    --frame;
-  }
-
-  function wake() {
-    clockNow = (clockLast = clock.now()) + clockSkew;
-    frame = timeout = 0;
-    try {
-      timerFlush();
-    } finally {
-      frame = 0;
-      nap();
-      clockNow = 0;
-    }
-  }
-
-  function poke() {
-    var now = clock.now(), delay = now - clockLast;
-    if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
-  }
-
-  function nap() {
-    var t0, t1 = taskHead, t2, time = Infinity;
-    while (t1) {
-      if (t1._call) {
-        if (time > t1._time) time = t1._time;
-        t0 = t1, t1 = t1._next;
-      } else {
-        t2 = t1._next, t1._next = null;
-        t1 = t0 ? t0._next = t2 : taskHead = t2;
-      }
-    }
-    taskTail = t0;
-    sleep(time);
-  }
-
-  function sleep(time) {
-    if (frame) return; // Soonest alarm already set, or will be.
-    if (timeout) timeout = clearTimeout(timeout);
-    var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
-    if (delay > 24) {
-      if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
-      if (interval) interval = clearInterval(interval);
-    } else {
-      if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
-      frame = 1, setFrame(wake);
-    }
-  }
-
-  function timeout$1(callback, delay, time) {
-    var t = new Timer;
-    delay = delay == null ? 0 : +delay;
-    t.restart(function(elapsed) {
-      t.stop();
-      callback(elapsed + delay);
-    }, delay, time);
-    return t;
-  }
-
-  function interval$1(callback, delay, time) {
-    var t = new Timer, total = delay;
-    if (delay == null) return t.restart(callback, delay, time), t;
-    delay = +delay, time = time == null ? now() : +time;
-    t.restart(function tick(elapsed) {
-      elapsed += total;
-      t.restart(tick, total += delay, time);
-      callback(elapsed);
-    }, delay, time);
-    return t;
-  }
-
-  var emptyOn = dispatch("start", "end", "interrupt");
-  var emptyTween = [];
-
-  var CREATED = 0;
-  var SCHEDULED = 1;
-  var STARTING = 2;
-  var STARTED = 3;
-  var RUNNING = 4;
-  var ENDING = 5;
-  var ENDED = 6;
-
-  function schedule(node, name, id, index, group, timing) {
-    var schedules = node.__transition;
-    if (!schedules) node.__transition = {};
-    else if (id in schedules) return;
-    create$1(node, id, {
-      name: name,
-      index: index, // For context during callback.
-      group: group, // For context during callback.
-      on: emptyOn,
-      tween: emptyTween,
-      time: timing.time,
-      delay: timing.delay,
-      duration: timing.duration,
-      ease: timing.ease,
-      timer: null,
-      state: CREATED
-    });
-  }
-
-  function init(node, id) {
-    var schedule = get$1(node, id);
-    if (schedule.state > CREATED) throw new Error("too late; already scheduled");
-    return schedule;
-  }
-
-  function set$1(node, id) {
-    var schedule = get$1(node, id);
-    if (schedule.state > STARTING) throw new Error("too late; already started");
-    return schedule;
-  }
-
-  function get$1(node, id) {
-    var schedule = node.__transition;
-    if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
-    return schedule;
-  }
-
-  function create$1(node, id, self) {
-    var schedules = node.__transition,
-        tween;
-
-    // Initialize the self timer when the transition is created.
-    // Note the actual delay is not known until the first callback!
-    schedules[id] = self;
-    self.timer = timer(schedule, 0, self.time);
-
-    function schedule(elapsed) {
-      self.state = SCHEDULED;
-      self.timer.restart(start, self.delay, self.time);
-
-      // If the elapsed delay is less than our first sleep, start immediately.
-      if (self.delay <= elapsed) start(elapsed - self.delay);
-    }
-
-    function start(elapsed) {
-      var i, j, n, o;
-
-      // If the state is not SCHEDULED, then we previously errored on start.
-      if (self.state !== SCHEDULED) return stop();
-
-      for (i in schedules) {
-        o = schedules[i];
-        if (o.name !== self.name) continue;
-
-        // While this element already has a starting transition during this frame,
-        // defer starting an interrupting transition until that transition has a
-        // chance to tick (and possibly end); see d3/d3-transition#54!
-        if (o.state === STARTED) return timeout$1(start);
-
-        // Interrupt the active transition, if any.
-        // Dispatch the interrupt event.
-        if (o.state === RUNNING) {
-          o.state = ENDED;
-          o.timer.stop();
-          o.on.call("interrupt", node, node.__data__, o.index, o.group);
-          delete schedules[i];
-        }
-
-        // Cancel any pre-empted transitions. No interrupt event is dispatched
-        // because the cancelled transitions never started. Note that this also
-        // removes this transition from the pending list!
-        else if (+i < id) {
-          o.state = ENDED;
-          o.timer.stop();
-          delete schedules[i];
-        }
-      }
-
-      // Defer the first tick to end of the current frame; see d3/d3#1576.
-      // Note the transition may be canceled after start and before the first tick!
-      // Note this must be scheduled before the start event; see d3/d3-transition#16!
-      // Assuming this is successful, subsequent callbacks go straight to tick.
-      timeout$1(function() {
-        if (self.state === STARTED) {
-          self.state = RUNNING;
-          self.timer.restart(tick, self.delay, self.time);
-          tick(elapsed);
-        }
-      });
-
-      // Dispatch the start event.
-      // Note this must be done before the tween are initialized.
-      self.state = STARTING;
-      self.on.call("start", node, node.__data__, self.index, self.group);
-      if (self.state !== STARTING) return; // interrupted
-      self.state = STARTED;
-
-      // Initialize the tween, deleting null tween.
-      tween = new Array(n = self.tween.length);
-      for (i = 0, j = -1; i < n; ++i) {
-        if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
-          tween[++j] = o;
-        }
-      }
-      tween.length = j + 1;
-    }
-
-    function tick(elapsed) {
-      var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
-          i = -1,
-          n = tween.length;
-
-      while (++i < n) {
-        tween[i].call(null, t);
-      }
-
-      // Dispatch the end event.
-      if (self.state === ENDING) {
-        self.on.call("end", node, node.__data__, self.index, self.group);
-        stop();
-      }
-    }
-
-    function stop() {
-      self.state = ENDED;
-      self.timer.stop();
-      delete schedules[id];
-      for (var i in schedules) return; // eslint-disable-line no-unused-vars
-      delete node.__transition;
-    }
-  }
-
-  function interrupt(node, name) {
-    var schedules = node.__transition,
-        schedule,
-        active,
-        empty = true,
-        i;
-
-    if (!schedules) return;
-
-    name = name == null ? null : name + "";
-
-    for (i in schedules) {
-      if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
-      active = schedule.state > STARTING && schedule.state < ENDING;
-      schedule.state = ENDED;
-      schedule.timer.stop();
-      if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group);
-      delete schedules[i];
-    }
-
-    if (empty) delete node.__transition;
-  }
-
-  function selection_interrupt(name) {
-    return this.each(function() {
-      interrupt(this, name);
-    });
-  }
-
-  function tweenRemove(id, name) {
-    var tween0, tween1;
-    return function() {
-      var schedule = set$1(this, id),
-          tween = schedule.tween;
-
-      // If this node shared tween with the previous node,
-      // just assign the updated shared tween and we’re done!
-      // Otherwise, copy-on-write.
-      if (tween !== tween0) {
-        tween1 = tween0 = tween;
-        for (var i = 0, n = tween1.length; i < n; ++i) {
-          if (tween1[i].name === name) {
-            tween1 = tween1.slice();
-            tween1.splice(i, 1);
-            break;
-          }
-        }
-      }
-
-      schedule.tween = tween1;
-    };
-  }
-
-  function tweenFunction(id, name, value) {
-    var tween0, tween1;
-    if (typeof value !== "function") throw new Error;
-    return function() {
-      var schedule = set$1(this, id),
-          tween = schedule.tween;
-
-      // If this node shared tween with the previous node,
-      // just assign the updated shared tween and we’re done!
-      // Otherwise, copy-on-write.
-      if (tween !== tween0) {
-        tween1 = (tween0 = tween).slice();
-        for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
-          if (tween1[i].name === name) {
-            tween1[i] = t;
-            break;
-          }
-        }
-        if (i === n) tween1.push(t);
-      }
-
-      schedule.tween = tween1;
-    };
-  }
-
-  function transition_tween(name, value) {
-    var id = this._id;
-
-    name += "";
-
-    if (arguments.length < 2) {
-      var tween = get$1(this.node(), id).tween;
-      for (var i = 0, n = tween.length, t; i < n; ++i) {
-        if ((t = tween[i]).name === name) {
-          return t.value;
-        }
-      }
-      return null;
-    }
-
-    return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
-  }
-
-  function tweenValue(transition, name, value) {
-    var id = transition._id;
-
-    transition.each(function() {
-      var schedule = set$1(this, id);
-      (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
-    });
-
-    return function(node) {
-      return get$1(node, id).value[name];
-    };
-  }
-
-  function interpolate$1(a, b) {
-    var c;
-    return (typeof b === "number" ? interpolateNumber
-        : b instanceof color ? interpolateRgb
-        : (c = color(b)) ? (b = c, interpolateRgb)
-        : interpolateString)(a, b);
-  }
-
-  function attrRemove$1(name) {
-    return function() {
-      this.removeAttribute(name);
-    };
-  }
-
-  function attrRemoveNS$1(fullname) {
-    return function() {
-      this.removeAttributeNS(fullname.space, fullname.local);
-    };
-  }
-
-  function attrConstant$1(name, interpolate, value1) {
-    var value00,
-        interpolate0;
-    return function() {
-      var value0 = this.getAttribute(name);
-      return value0 === value1 ? null
-          : value0 === value00 ? interpolate0
-          : interpolate0 = interpolate(value00 = value0, value1);
-    };
-  }
-
-  function attrConstantNS$1(fullname, interpolate, value1) {
-    var value00,
-        interpolate0;
-    return function() {
-      var value0 = this.getAttributeNS(fullname.space, fullname.local);
-      return value0 === value1 ? null
-          : value0 === value00 ? interpolate0
-          : interpolate0 = interpolate(value00 = value0, value1);
-    };
-  }
-
-  function attrFunction$1(name, interpolate, value) {
-    var value00,
-        value10,
-        interpolate0;
-    return function() {
-      var value0, value1 = value(this);
-      if (value1 == null) return void this.removeAttribute(name);
-      value0 = this.getAttribute(name);
-      return value0 === value1 ? null
-          : value0 === value00 && value1 === value10 ? interpolate0
-          : interpolate0 = interpolate(value00 = value0, value10 = value1);
-    };
-  }
-
-  function attrFunctionNS$1(fullname, interpolate, value) {
-    var value00,
-        value10,
-        interpolate0;
-    return function() {
-      var value0, value1 = value(this);
-      if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
-      value0 = this.getAttributeNS(fullname.space, fullname.local);
-      return value0 === value1 ? null
-          : value0 === value00 && value1 === value10 ? interpolate0
-          : interpolate0 = interpolate(value00 = value0, value10 = value1);
-    };
-  }
-
-  function transition_attr(name, value) {
-    var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1;
-    return this.attrTween(name, typeof value === "function"
-        ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
-        : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
-        : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
-  }
-
-  function attrTweenNS(fullname, value) {
-    function tween() {
-      var node = this, i = value.apply(node, arguments);
-      return i && function(t) {
-        node.setAttributeNS(fullname.space, fullname.local, i(t));
-      };
-    }
-    tween._value = value;
-    return tween;
-  }
-
-  function attrTween(name, value) {
-    function tween() {
-      var node = this, i = value.apply(node, arguments);
-      return i && function(t) {
-        node.setAttribute(name, i(t));
-      };
-    }
-    tween._value = value;
-    return tween;
-  }
-
-  function transition_attrTween(name, value) {
-    var key = "attr." + name;
-    if (arguments.length < 2) return (key = this.tween(key)) && key._value;
-    if (value == null) return this.tween(key, null);
-    if (typeof value !== "function") throw new Error;
-    var fullname = namespace(name);
-    return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
-  }
-
-  function delayFunction(id, value) {
-    return function() {
-      init(this, id).delay = +value.apply(this, arguments);
-    };
-  }
-
-  function delayConstant(id, value) {
-    return value = +value, function() {
-      init(this, id).delay = value;
-    };
-  }
-
-  function transition_delay(value) {
-    var id = this._id;
-
-    return arguments.length
-        ? this.each((typeof value === "function"
-            ? delayFunction
-            : delayConstant)(id, value))
-        : get$1(this.node(), id).delay;
-  }
-
-  function durationFunction(id, value) {
-    return function() {
-      set$1(this, id).duration = +value.apply(this, arguments);
-    };
-  }
-
-  function durationConstant(id, value) {
-    return value = +value, function() {
-      set$1(this, id).duration = value;
-    };
-  }
-
-  function transition_duration(value) {
-    var id = this._id;
-
-    return arguments.length
-        ? this.each((typeof value === "function"
-            ? durationFunction
-            : durationConstant)(id, value))
-        : get$1(this.node(), id).duration;
-  }
-
-  function easeConstant(id, value) {
-    if (typeof value !== "function") throw new Error;
-    return function() {
-      set$1(this, id).ease = value;
-    };
-  }
-
-  function transition_ease(value) {
-    var id = this._id;
-
-    return arguments.length
-        ? this.each(easeConstant(id, value))
-        : get$1(this.node(), id).ease;
-  }
-
-  function transition_filter(match) {
-    if (typeof match !== "function") match = matcher$1(match);
-
-    for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
-        if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
-          subgroup.push(node);
-        }
-      }
-    }
-
-    return new Transition(subgroups, this._parents, this._name, this._id);
-  }
-
-  function transition_merge(transition) {
-    if (transition._id !== this._id) throw new Error;
-
-    for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
-      for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
-        if (node = group0[i] || group1[i]) {
-          merge[i] = node;
-        }
-      }
-    }
-
-    for (; j < m0; ++j) {
-      merges[j] = groups0[j];
-    }
-
-    return new Transition(merges, this._parents, this._name, this._id);
-  }
-
-  function start(name) {
-    return (name + "").trim().split(/^|\s+/).every(function(t) {
-      var i = t.indexOf(".");
-      if (i >= 0) t = t.slice(0, i);
-      return !t || t === "start";
-    });
-  }
-
-  function onFunction(id, name, listener) {
-    var on0, on1, sit = start(name) ? init : set$1;
-    return function() {
-      var schedule = sit(this, id),
-          on = schedule.on;
-
-      // If this node shared a dispatch with the previous node,
-      // just assign the updated shared dispatch and we’re done!
-      // Otherwise, copy-on-write.
-      if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
-
-      schedule.on = on1;
-    };
-  }
-
-  function transition_on(name, listener) {
-    var id = this._id;
-
-    return arguments.length < 2
-        ? get$1(this.node(), id).on.on(name)
-        : this.each(onFunction(id, name, listener));
-  }
-
-  function removeFunction(id) {
-    return function() {
-      var parent = this.parentNode;
-      for (var i in this.__transition) if (+i !== id) return;
-      if (parent) parent.removeChild(this);
-    };
-  }
-
-  function transition_remove() {
-    return this.on("end.remove", removeFunction(this._id));
-  }
-
-  function transition_select(select) {
-    var name = this._name,
-        id = this._id;
-
-    if (typeof select !== "function") select = selector(select);
-
-    for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
-        if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
-          if ("__data__" in node) subnode.__data__ = node.__data__;
-          subgroup[i] = subnode;
-          schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
-        }
-      }
-    }
-
-    return new Transition(subgroups, this._parents, name, id);
-  }
-
-  function transition_selectAll(select) {
-    var name = this._name,
-        id = this._id;
-
-    if (typeof select !== "function") select = selectorAll(select);
-
-    for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
-        if (node = group[i]) {
-          for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
-            if (child = children[k]) {
-              schedule(child, name, id, k, children, inherit);
-            }
-          }
-          subgroups.push(children);
-          parents.push(node);
-        }
-      }
-    }
-
-    return new Transition(subgroups, parents, name, id);
-  }
-
-  var Selection$1 = selection.prototype.constructor;
-
-  function transition_selection() {
-    return new Selection$1(this._groups, this._parents);
-  }
-
-  function styleRemove$1(name, interpolate) {
-    var value00,
-        value10,
-        interpolate0;
-    return function() {
-      var value0 = styleValue(this, name),
-          value1 = (this.style.removeProperty(name), styleValue(this, name));
-      return value0 === value1 ? null
-          : value0 === value00 && value1 === value10 ? interpolate0
-          : interpolate0 = interpolate(value00 = value0, value10 = value1);
-    };
-  }
-
-  function styleRemoveEnd(name) {
-    return function() {
-      this.style.removeProperty(name);
-    };
-  }
-
-  function styleConstant$1(name, interpolate, value1) {
-    var value00,
-        interpolate0;
-    return function() {
-      var value0 = styleValue(this, name);
-      return value0 === value1 ? null
-          : value0 === value00 ? interpolate0
-          : interpolate0 = interpolate(value00 = value0, value1);
-    };
-  }
-
-  function styleFunction$1(name, interpolate, value) {
-    var value00,
-        value10,
-        interpolate0;
-    return function() {
-      var value0 = styleValue(this, name),
-          value1 = value(this);
-      if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
-      return value0 === value1 ? null
-          : value0 === value00 && value1 === value10 ? interpolate0
-          : interpolate0 = interpolate(value00 = value0, value10 = value1);
-    };
-  }
-
-  function transition_style(name, value, priority) {
-    var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1;
-    return value == null ? this
-            .styleTween(name, styleRemove$1(name, i))
-            .on("end.style." + name, styleRemoveEnd(name))
-        : this.styleTween(name, typeof value === "function"
-            ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
-            : styleConstant$1(name, i, value + ""), priority);
-  }
-
-  function styleTween(name, value, priority) {
-    function tween() {
-      var node = this, i = value.apply(node, arguments);
-      return i && function(t) {
-        node.style.setProperty(name, i(t), priority);
-      };
-    }
-    tween._value = value;
-    return tween;
-  }
-
-  function transition_styleTween(name, value, priority) {
-    var key = "style." + (name += "");
-    if (arguments.length < 2) return (key = this.tween(key)) && key._value;
-    if (value == null) return this.tween(key, null);
-    if (typeof value !== "function") throw new Error;
-    return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
-  }
-
-  function textConstant$1(value) {
-    return function() {
-      this.textContent = value;
-    };
-  }
-
-  function textFunction$1(value) {
-    return function() {
-      var value1 = value(this);
-      this.textContent = value1 == null ? "" : value1;
-    };
-  }
-
-  function transition_text(value) {
-    return this.tween("text", typeof value === "function"
-        ? textFunction$1(tweenValue(this, "text", value))
-        : textConstant$1(value == null ? "" : value + ""));
-  }
-
-  function transition_transition() {
-    var name = this._name,
-        id0 = this._id,
-        id1 = newId();
-
-    for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
-      for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
-        if (node = group[i]) {
-          var inherit = get$1(node, id0);
-          schedule(node, name, id1, i, group, {
-            time: inherit.time + inherit.delay + inherit.duration,
-            delay: 0,
-            duration: inherit.duration,
-            ease: inherit.ease
-          });
-        }
-      }
-    }
-
-    return new Transition(groups, this._parents, name, id1);
-  }
-
-  var id = 0;
-
-  function Transition(groups, parents, name, id) {
-    this._groups = groups;
-    this._parents = parents;
-    this._name = name;
-    this._id = id;
-  }
-
-  function transition(name) {
-    return selection().transition(name);
-  }
-
-  function newId() {
-    return ++id;
-  }
-
-  var selection_prototype = selection.prototype;
-
-  Transition.prototype = transition.prototype = {
-    constructor: Transition,
-    select: transition_select,
-    selectAll: transition_selectAll,
-    filter: transition_filter,
-    merge: transition_merge,
-    selection: transition_selection,
-    transition: transition_transition,
-    call: selection_prototype.call,
-    nodes: selection_prototype.nodes,
-    node: selection_prototype.node,
-    size: selection_prototype.size,
-    empty: selection_prototype.empty,
-    each: selection_prototype.each,
-    on: transition_on,
-    attr: transition_attr,
-    attrTween: transition_attrTween,
-    style: transition_style,
-    styleTween: transition_styleTween,
-    text: transition_text,
-    remove: transition_remove,
-    tween: transition_tween,
-    delay: transition_delay,
-    duration: transition_duration,
-    ease: transition_ease
-  };
-
-  function linear$1(t) {
-    return +t;
-  }
-
-  function quadIn(t) {
-    return t * t;
-  }
-
-  function quadOut(t) {
-    return t * (2 - t);
-  }
-
-  function quadInOut(t) {
-    return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
-  }
-
-  function cubicIn(t) {
-    return t * t * t;
-  }
-
-  function cubicOut(t) {
-    return --t * t * t + 1;
-  }
-
-  function cubicInOut(t) {
-    return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
-  }
-
-  var exponent = 3;
-
-  var polyIn = (function custom(e) {
-    e = +e;
-
-    function polyIn(t) {
-      return Math.pow(t, e);
-    }
-
-    polyIn.exponent = custom;
-
-    return polyIn;
-  })(exponent);
-
-  var polyOut = (function custom(e) {
-    e = +e;
-
-    function polyOut(t) {
-      return 1 - Math.pow(1 - t, e);
-    }
-
-    polyOut.exponent = custom;
+       var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+       function commonjsRequire () {
+               throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
+       }
+
+       function unwrapExports (x) {
+               return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+       }
+
+       function createCommonjsModule(fn, module) {
+               return module = { exports: {} }, fn(module, module.exports), module.exports;
+       }
+
+       function getCjsExportFromNamespace (n) {
+               return n && n['default'] || n;
+       }
+
+       var isImplemented = function () {
+               var set, iterator, result;
+               if (typeof Set !== 'function') return false;
+               set = new Set(['raz', 'dwa', 'trzy']);
+               if (String(set) !== '[object Set]') return false;
+               if (set.size !== 3) return false;
+               if (typeof set.add !== 'function') return false;
+               if (typeof set.clear !== 'function') return false;
+               if (typeof set.delete !== 'function') return false;
+               if (typeof set.entries !== 'function') return false;
+               if (typeof set.forEach !== 'function') return false;
+               if (typeof set.has !== 'function') return false;
+               if (typeof set.keys !== 'function') return false;
+               if (typeof set.values !== 'function') return false;
+
+               iterator = set.values();
+               result = iterator.next();
+               if (result.done !== false) return false;
+               if (result.value !== 'raz') return false;
+
+               return true;
+       };
+
+       // eslint-disable-next-line no-empty-function
+       var noop = function () {};
+
+       var _undefined = noop(); // Support ES3 engines
+
+       var isValue = function (val) {
+        return (val !== _undefined) && (val !== null);
+       };
+
+       var validValue = function (value) {
+               if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
+               return value;
+       };
+
+       var clear = function () {
+               validValue(this).length = 0;
+               return this;
+       };
+
+       var isImplemented$1 = function () {
+               var numberIsNaN = Number.isNaN;
+               if (typeof numberIsNaN !== "function") return false;
+               return !numberIsNaN({}) && numberIsNaN(NaN) && !numberIsNaN(34);
+       };
+
+       var shim = function (value) {
+               // eslint-disable-next-line no-self-compare
+               return value !== value;
+       };
+
+       var isNan = isImplemented$1()
+               ? Number.isNaN
+               : shim;
+
+       var isImplemented$2 = function () {
+               var sign = Math.sign;
+               if (typeof sign !== "function") return false;
+               return (sign(10) === 1) && (sign(-20) === -1);
+       };
+
+       var shim$1 = function (value) {
+               value = Number(value);
+               if (isNaN(value) || (value === 0)) return value;
+               return value > 0 ? 1 : -1;
+       };
+
+       var sign = isImplemented$2()
+               ? Math.sign
+               : shim$1;
+
+       var abs = Math.abs, floor = Math.floor;
+
+       var toInteger = function (value) {
+               if (isNaN(value)) return 0;
+               value = Number(value);
+               if ((value === 0) || !isFinite(value)) return value;
+               return sign(value) * floor(abs(value));
+       };
+
+       var max = Math.max;
+
+       var toPosInteger = function (value) {
+        return max(0, toInteger(value));
+       };
+
+       var indexOf           = Array.prototype.indexOf
+         , objHasOwnProperty = Object.prototype.hasOwnProperty
+         , abs$1               = Math.abs
+         , floor$1             = Math.floor;
+
+       var eIndexOf = function (searchElement /*, fromIndex*/) {
+               var i, length, fromIndex, val;
+               if (!isNan(searchElement)) return indexOf.apply(this, arguments);
+
+               length = toPosInteger(validValue(this).length);
+               fromIndex = arguments[1];
+               if (isNaN(fromIndex)) fromIndex = 0;
+               else if (fromIndex >= 0) fromIndex = floor$1(fromIndex);
+               else fromIndex = toPosInteger(this.length) - floor$1(abs$1(fromIndex));
+
+               for (i = fromIndex; i < length; ++i) {
+                       if (objHasOwnProperty.call(this, i)) {
+                               val = this[i];
+                               if (isNan(val)) return i; // Jslint: ignore
+                       }
+               }
+               return -1;
+       };
+
+       var create = Object.create, getPrototypeOf = Object.getPrototypeOf, plainObject = {};
+
+       var isImplemented$3 = function (/* CustomCreate*/) {
+               var setPrototypeOf = Object.setPrototypeOf, customCreate = arguments[0] || create;
+               if (typeof setPrototypeOf !== "function") return false;
+               return getPrototypeOf(setPrototypeOf(customCreate(null), plainObject)) === plainObject;
+       };
+
+       var map = { function: true, object: true };
+
+       var isObject = function (value) {
+               return (isValue(value) && map[typeof value]) || false;
+       };
+
+       var create$1 = Object.create, shim$2;
+
+       if (!isImplemented$3()) {
+               shim$2 = shim$3;
+       }
+
+       var create_1 = (function () {
+               var nullObject, polyProps, desc;
+               if (!shim$2) return create$1;
+               if (shim$2.level !== 1) return create$1;
+
+               nullObject = {};
+               polyProps = {};
+               desc = {
+                       configurable: false,
+                       enumerable: false,
+                       writable: true,
+                       value: undefined
+               };
+               Object.getOwnPropertyNames(Object.prototype).forEach(function (name) {
+                       if (name === "__proto__") {
+                               polyProps[name] = {
+                                       configurable: true,
+                                       enumerable: false,
+                                       writable: true,
+                                       value: undefined
+                               };
+                               return;
+                       }
+                       polyProps[name] = desc;
+               });
+               Object.defineProperties(nullObject, polyProps);
+
+               Object.defineProperty(shim$2, "nullPolyfill", {
+                       configurable: false,
+                       enumerable: false,
+                       writable: false,
+                       value: nullObject
+               });
+
+               return function (prototype, props) {
+                       return create$1(prototype === null ? nullObject : prototype, props);
+               };
+       }());
+
+       var objIsPrototypeOf = Object.prototype.isPrototypeOf
+         , defineProperty  = Object.defineProperty
+         , nullDesc        = {
+               configurable: true,
+               enumerable: false,
+               writable: true,
+               value: undefined
+       }
+         , validate;
+
+       validate = function (obj, prototype) {
+               validValue(obj);
+               if (prototype === null || isObject(prototype)) return obj;
+               throw new TypeError("Prototype must be null or an object");
+       };
+
+       var shim$3 = (function (status) {
+               var fn, set;
+               if (!status) return null;
+               if (status.level === 2) {
+                       if (status.set) {
+                               set = status.set;
+                               fn = function (obj, prototype) {
+                                       set.call(validate(obj, prototype), prototype);
+                                       return obj;
+                               };
+                       } else {
+                               fn = function (obj, prototype) {
+                                       validate(obj, prototype).__proto__ = prototype;
+                                       return obj;
+                               };
+                       }
+               } else {
+                       fn = function self(obj, prototype) {
+                               var isNullBase;
+                               validate(obj, prototype);
+                               isNullBase = objIsPrototypeOf.call(self.nullPolyfill, obj);
+                               if (isNullBase) delete self.nullPolyfill.__proto__;
+                               if (prototype === null) prototype = self.nullPolyfill;
+                               obj.__proto__ = prototype;
+                               if (isNullBase) defineProperty(self.nullPolyfill, "__proto__", nullDesc);
+                               return obj;
+                       };
+               }
+               return Object.defineProperty(fn, "level", {
+                       configurable: false,
+                       enumerable: false,
+                       writable: false,
+                       value: status.level
+               });
+       }(
+               (function () {
+                       var tmpObj1 = Object.create(null)
+                         , tmpObj2 = {}
+                         , set
+                         , desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+
+                       if (desc) {
+                               try {
+                                       set = desc.set; // Opera crashes at this point
+                                       set.call(tmpObj1, tmpObj2);
+                               } catch (ignore) {}
+                               if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { set: set, level: 2 };
+                       }
+
+                       tmpObj1.__proto__ = tmpObj2;
+                       if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 2 };
+
+                       tmpObj1 = {};
+                       tmpObj1.__proto__ = tmpObj2;
+                       if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 1 };
+
+                       return false;
+               })()
+       ));
+
+       var setPrototypeOf = isImplemented$3()
+               ? Object.setPrototypeOf
+               : shim$3;
+
+       var validCallable = function (fn) {
+               if (typeof fn !== "function") throw new TypeError(fn + " is not a function");
+               return fn;
+       };
+
+       var isImplemented$4 = function () {
+               var assign = Object.assign, obj;
+               if (typeof assign !== "function") return false;
+               obj = { foo: "raz" };
+               assign(obj, { bar: "dwa" }, { trzy: "trzy" });
+               return (obj.foo + obj.bar + obj.trzy) === "razdwatrzy";
+       };
+
+       var isImplemented$5 = function () {
+               try {
+                       return true;
+               } catch (e) {
+                       return false;
+               }
+       };
+
+       var keys = Object.keys;
+
+       var shim$4 = function (object) { return keys(isValue(object) ? Object(object) : object); };
+
+       var keys$1 = isImplemented$5() ? Object.keys : shim$4;
+
+       var max$1   = Math.max;
+
+       var shim$5 = function (dest, src /*, …srcn*/) {
+               var error, i, length = max$1(arguments.length, 2), assign;
+               dest = Object(validValue(dest));
+               assign = function (key) {
+                       try {
+                               dest[key] = src[key];
+                       } catch (e) {
+                               if (!error) error = e;
+                       }
+               };
+               for (i = 1; i < length; ++i) {
+                       src = arguments[i];
+                       keys$1(src).forEach(assign);
+               }
+               if (error !== undefined) throw error;
+               return dest;
+       };
+
+       var assign = isImplemented$4()
+               ? Object.assign
+               : shim$5;
+
+       var forEach = Array.prototype.forEach, create$2 = Object.create;
+
+       var process$1 = function (src, obj) {
+               var key;
+               for (key in src) obj[key] = src[key];
+       };
+
+       // eslint-disable-next-line no-unused-vars
+       var normalizeOptions = function (opts1 /*, …options*/) {
+               var result = create$2(null);
+               forEach.call(arguments, function (options) {
+                       if (!isValue(options)) return;
+                       process$1(Object(options), result);
+               });
+               return result;
+       };
+
+       // Deprecated
+
+       var isCallable = function (obj) {
+        return typeof obj === "function";
+       };
+
+       var str = "razdwatrzy";
+
+       var isImplemented$6 = function () {
+               if (typeof str.contains !== "function") return false;
+               return (str.contains("dwa") === true) && (str.contains("foo") === false);
+       };
+
+       var indexOf$1 = String.prototype.indexOf;
+
+       var shim$6 = function (searchString/*, position*/) {
+               return indexOf$1.call(this, searchString, arguments[1]) > -1;
+       };
+
+       var contains = isImplemented$6()
+               ? String.prototype.contains
+               : shim$6;
+
+       var d_1 = createCommonjsModule(function (module) {
+
+       var d;
+
+       d = module.exports = function (dscr, value/*, options*/) {
+               var c, e, w, options, desc;
+               if ((arguments.length < 2) || (typeof dscr !== 'string')) {
+                       options = value;
+                       value = dscr;
+                       dscr = null;
+               } else {
+                       options = arguments[2];
+               }
+               if (dscr == null) {
+                       c = w = true;
+                       e = false;
+               } else {
+                       c = contains.call(dscr, 'c');
+                       e = contains.call(dscr, 'e');
+                       w = contains.call(dscr, 'w');
+               }
+
+               desc = { value: value, configurable: c, enumerable: e, writable: w };
+               return !options ? desc : assign(normalizeOptions(options), desc);
+       };
+
+       d.gs = function (dscr, get, set/*, options*/) {
+               var c, e, options, desc;
+               if (typeof dscr !== 'string') {
+                       options = set;
+                       set = get;
+                       get = dscr;
+                       dscr = null;
+               } else {
+                       options = arguments[3];
+               }
+               if (get == null) {
+                       get = undefined;
+               } else if (!isCallable(get)) {
+                       options = get;
+                       get = set = undefined;
+               } else if (set == null) {
+                       set = undefined;
+               } else if (!isCallable(set)) {
+                       options = set;
+                       set = undefined;
+               }
+               if (dscr == null) {
+                       c = true;
+                       e = false;
+               } else {
+                       c = contains.call(dscr, 'c');
+                       e = contains.call(dscr, 'e');
+               }
+
+               desc = { get: get, set: set, configurable: c, enumerable: e };
+               return !options ? desc : assign(normalizeOptions(options), desc);
+       };
+       });
+
+       var eventEmitter = createCommonjsModule(function (module, exports) {
+
+       var apply = Function.prototype.apply, call = Function.prototype.call
+         , create = Object.create, defineProperty = Object.defineProperty
+         , defineProperties = Object.defineProperties
+         , hasOwnProperty = Object.prototype.hasOwnProperty
+         , descriptor = { configurable: true, enumerable: false, writable: true }
+
+         , on, once, off, emit, methods, descriptors, base;
+
+       on = function (type, listener) {
+               var data;
+
+               validCallable(listener);
+
+               if (!hasOwnProperty.call(this, '__ee__')) {
+                       data = descriptor.value = create(null);
+                       defineProperty(this, '__ee__', descriptor);
+                       descriptor.value = null;
+               } else {
+                       data = this.__ee__;
+               }
+               if (!data[type]) data[type] = listener;
+               else if (typeof data[type] === 'object') data[type].push(listener);
+               else data[type] = [data[type], listener];
+
+               return this;
+       };
+
+       once = function (type, listener) {
+               var once, self;
+
+               validCallable(listener);
+               self = this;
+               on.call(this, type, once = function () {
+                       off.call(self, type, once);
+                       apply.call(listener, this, arguments);
+               });
+
+               once.__eeOnceListener__ = listener;
+               return this;
+       };
+
+       off = function (type, listener) {
+               var data, listeners, candidate, i;
+
+               validCallable(listener);
+
+               if (!hasOwnProperty.call(this, '__ee__')) return this;
+               data = this.__ee__;
+               if (!data[type]) return this;
+               listeners = data[type];
+
+               if (typeof listeners === 'object') {
+                       for (i = 0; (candidate = listeners[i]); ++i) {
+                               if ((candidate === listener) ||
+                                               (candidate.__eeOnceListener__ === listener)) {
+                                       if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
+                                       else listeners.splice(i, 1);
+                               }
+                       }
+               } else {
+                       if ((listeners === listener) ||
+                                       (listeners.__eeOnceListener__ === listener)) {
+                               delete data[type];
+                       }
+               }
+
+               return this;
+       };
+
+       emit = function (type) {
+               var i, l, listener, listeners, args;
+
+               if (!hasOwnProperty.call(this, '__ee__')) return;
+               listeners = this.__ee__[type];
+               if (!listeners) return;
+
+               if (typeof listeners === 'object') {
+                       l = arguments.length;
+                       args = new Array(l - 1);
+                       for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
+
+                       listeners = listeners.slice();
+                       for (i = 0; (listener = listeners[i]); ++i) {
+                               apply.call(listener, this, args);
+                       }
+               } else {
+                       switch (arguments.length) {
+                       case 1:
+                               call.call(listeners, this);
+                               break;
+                       case 2:
+                               call.call(listeners, this, arguments[1]);
+                               break;
+                       case 3:
+                               call.call(listeners, this, arguments[1], arguments[2]);
+                               break;
+                       default:
+                               l = arguments.length;
+                               args = new Array(l - 1);
+                               for (i = 1; i < l; ++i) {
+                                       args[i - 1] = arguments[i];
+                               }
+                               apply.call(listeners, this, args);
+                       }
+               }
+       };
+
+       methods = {
+               on: on,
+               once: once,
+               off: off,
+               emit: emit
+       };
+
+       descriptors = {
+               on: d_1(on),
+               once: d_1(once),
+               off: d_1(off),
+               emit: d_1(emit)
+       };
+
+       base = defineProperties({}, descriptors);
+
+       module.exports = exports = function (o) {
+               return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
+       };
+       exports.methods = methods;
+       });
+       var eventEmitter_1 = eventEmitter.methods;
+
+       var validTypes = { object: true, symbol: true };
+
+       var isImplemented$7 = function () {
+               if (typeof Symbol !== 'function') return false;
+               try { } catch (e) { return false; }
+
+               // Return 'true' also for polyfills
+               if (!validTypes[typeof Symbol.iterator]) return false;
+               if (!validTypes[typeof Symbol.toPrimitive]) return false;
+               if (!validTypes[typeof Symbol.toStringTag]) return false;
+
+               return true;
+       };
+
+       var isSymbol = function (x) {
+               if (!x) return false;
+               if (typeof x === 'symbol') return true;
+               if (!x.constructor) return false;
+               if (x.constructor.name !== 'Symbol') return false;
+               return (x[x.constructor.toStringTag] === 'Symbol');
+       };
+
+       var validateSymbol = function (value) {
+               if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
+               return value;
+       };
+
+       var create$3 = Object.create, defineProperties = Object.defineProperties
+         , defineProperty$1 = Object.defineProperty, objPrototype = Object.prototype
+         , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create$3(null)
+         , isNativeSafe;
+
+       if (typeof Symbol === 'function') {
+               NativeSymbol = Symbol;
+               try {
+                       String(NativeSymbol());
+                       isNativeSafe = true;
+               } catch (ignore) {}
+       }
+
+       var generateName = (function () {
+               var created = create$3(null);
+               return function (desc) {
+                       var postfix = 0, name, ie11BugWorkaround;
+                       while (created[desc + (postfix || '')]) ++postfix;
+                       desc += (postfix || '');
+                       created[desc] = true;
+                       name = '@@' + desc;
+                       defineProperty$1(objPrototype, name, d_1.gs(null, function (value) {
+                               // For IE11 issue see:
+                               // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
+                               //    ie11-broken-getters-on-dom-objects
+                               // https://github.com/medikoo/es6-symbol/issues/12
+                               if (ie11BugWorkaround) return;
+                               ie11BugWorkaround = true;
+                               defineProperty$1(this, name, d_1(value));
+                               ie11BugWorkaround = false;
+                       }));
+                       return name;
+               };
+       }());
+
+       // Internal constructor (not one exposed) for creating Symbol instances.
+       // This one is used to ensure that `someSymbol instanceof Symbol` always return false
+       HiddenSymbol = function Symbol(description) {
+               if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');
+               return SymbolPolyfill(description);
+       };
+
+       // Exposed `Symbol` constructor
+       // (returns instances of HiddenSymbol)
+       var polyfill = SymbolPolyfill = function Symbol(description) {
+               var symbol;
+               if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');
+               if (isNativeSafe) return NativeSymbol(description);
+               symbol = create$3(HiddenSymbol.prototype);
+               description = (description === undefined ? '' : String(description));
+               return defineProperties(symbol, {
+                       __description__: d_1('', description),
+                       __name__: d_1('', generateName(description))
+               });
+       };
+       defineProperties(SymbolPolyfill, {
+               for: d_1(function (key) {
+                       if (globalSymbols[key]) return globalSymbols[key];
+                       return (globalSymbols[key] = SymbolPolyfill(String(key)));
+               }),
+               keyFor: d_1(function (s) {
+                       var key;
+                       validateSymbol(s);
+                       for (key in globalSymbols) if (globalSymbols[key] === s) return key;
+               }),
+
+               // To ensure proper interoperability with other native functions (e.g. Array.from)
+               // fallback to eventual native implementation of given symbol
+               hasInstance: d_1('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),
+               isConcatSpreadable: d_1('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||
+                       SymbolPolyfill('isConcatSpreadable')),
+               iterator: d_1('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),
+               match: d_1('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),
+               replace: d_1('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),
+               search: d_1('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),
+               species: d_1('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),
+               split: d_1('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),
+               toPrimitive: d_1('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),
+               toStringTag: d_1('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),
+               unscopables: d_1('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))
+       });
+
+       // Internal tweaks for real symbol producer
+       defineProperties(HiddenSymbol.prototype, {
+               constructor: d_1(SymbolPolyfill),
+               toString: d_1('', function () { return this.__name__; })
+       });
+
+       // Proper implementation of methods exposed on Symbol.prototype
+       // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
+       defineProperties(SymbolPolyfill.prototype, {
+               toString: d_1(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),
+               valueOf: d_1(function () { return validateSymbol(this); })
+       });
+       defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () {
+               var symbol = validateSymbol(this);
+               if (typeof symbol === 'symbol') return symbol;
+               return symbol.toString();
+       }));
+       defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol'));
+
+       // Proper implementaton of toPrimitive and toStringTag for returned symbol instances
+       defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,
+               d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
+
+       // Note: It's important to define `toPrimitive` as last one, as some implementations
+       // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
+       // And that may invoke error in definition flow:
+       // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
+       defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,
+               d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
+
+       var es6Symbol = isImplemented$7() ? Symbol : polyfill;
+
+       var objToString = Object.prototype.toString
+         , id = objToString.call(
+               (function () {
+                       return arguments;
+               })()
+       );
+
+       var isArguments = function (value) {
+               return objToString.call(value) === id;
+       };
+
+       var objToString$1 = Object.prototype.toString, id$1 = objToString$1.call("");
+
+       var isString = function (value) {
+               return (
+                       typeof value === "string" ||
+                       (value &&
+                               typeof value === "object" &&
+                               (value instanceof String || objToString$1.call(value) === id$1)) ||
+                       false
+               );
+       };
+
+       var iteratorSymbol = es6Symbol.iterator
+         , isArray        = Array.isArray;
+
+       var isIterable = function (value) {
+               if (!isValue(value)) return false;
+               if (isArray(value)) return true;
+               if (isString(value)) return true;
+               if (isArguments(value)) return true;
+               return typeof value[iteratorSymbol] === "function";
+       };
+
+       var validIterable = function (value) {
+               if (!isIterable(value)) throw new TypeError(value + " is not iterable");
+               return value;
+       };
+
+       var isImplemented$8 = function () {
+               var from = Array.from, arr, result;
+               if (typeof from !== "function") return false;
+               arr = ["raz", "dwa"];
+               result = from(arr);
+               return Boolean(result && (result !== arr) && (result[1] === "dwa"));
+       };
+
+       var objToString$2 = Object.prototype.toString, id$2 = objToString$2.call(noop);
+
+       var isFunction = function (value) {
+               return typeof value === "function" && objToString$2.call(value) === id$2;
+       };
+
+       var iteratorSymbol$1 = es6Symbol.iterator
+         , isArray$1        = Array.isArray
+         , call           = Function.prototype.call
+         , desc           = { configurable: true, enumerable: true, writable: true, value: null }
+         , defineProperty$2 = Object.defineProperty;
+
+       // eslint-disable-next-line complexity, max-lines-per-function
+       var shim$7 = function (arrayLike /*, mapFn, thisArg*/) {
+               var mapFn = arguments[1]
+                 , thisArg = arguments[2]
+                 , Context
+                 , i
+                 , j
+                 , arr
+                 , length
+                 , code
+                 , iterator
+                 , result
+                 , getIterator
+                 , value;
+
+               arrayLike = Object(validValue(arrayLike));
+
+               if (isValue(mapFn)) validCallable(mapFn);
+               if (!this || this === Array || !isFunction(this)) {
+                       // Result: Plain array
+                       if (!mapFn) {
+                               if (isArguments(arrayLike)) {
+                                       // Source: Arguments
+                                       length = arrayLike.length;
+                                       if (length !== 1) return Array.apply(null, arrayLike);
+                                       arr = new Array(1);
+                                       arr[0] = arrayLike[0];
+                                       return arr;
+                               }
+                               if (isArray$1(arrayLike)) {
+                                       // Source: Array
+                                       arr = new Array(length = arrayLike.length);
+                                       for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
+                                       return arr;
+                               }
+                       }
+                       arr = [];
+               } else {
+                       // Result: Non plain array
+                       Context = this;
+               }
+
+               if (!isArray$1(arrayLike)) {
+                       if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) {
+                               // Source: Iterator
+                               iterator = validCallable(getIterator).call(arrayLike);
+                               if (Context) arr = new Context();
+                               result = iterator.next();
+                               i = 0;
+                               while (!result.done) {
+                                       value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
+                                       if (Context) {
+                                               desc.value = value;
+                                               defineProperty$2(arr, i, desc);
+                                       } else {
+                                               arr[i] = value;
+                                       }
+                                       result = iterator.next();
+                                       ++i;
+                               }
+                               length = i;
+                       } else if (isString(arrayLike)) {
+                               // Source: String
+                               length = arrayLike.length;
+                               if (Context) arr = new Context();
+                               for (i = 0, j = 0; i < length; ++i) {
+                                       value = arrayLike[i];
+                                       if (i + 1 < length) {
+                                               code = value.charCodeAt(0);
+                                               // eslint-disable-next-line max-depth
+                                               if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
+                                       }
+                                       value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
+                                       if (Context) {
+                                               desc.value = value;
+                                               defineProperty$2(arr, j, desc);
+                                       } else {
+                                               arr[j] = value;
+                                       }
+                                       ++j;
+                               }
+                               length = j;
+                       }
+               }
+               if (length === undefined) {
+                       // Source: array or array-like
+                       length = toPosInteger(arrayLike.length);
+                       if (Context) arr = new Context(length);
+                       for (i = 0; i < length; ++i) {
+                               value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
+                               if (Context) {
+                                       desc.value = value;
+                                       defineProperty$2(arr, i, desc);
+                               } else {
+                                       arr[i] = value;
+                               }
+                       }
+               }
+               if (Context) {
+                       desc.value = null;
+                       arr.length = length;
+               }
+               return arr;
+       };
+
+       var from_1 = isImplemented$8()
+               ? Array.from
+               : shim$7;
+
+       var copy = function (obj/*, propertyNames, options*/) {
+               var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
+               if (copy !== obj && !propertyNames) return copy;
+               var result = {};
+               if (propertyNames) {
+                       from_1(propertyNames, function (propertyName) {
+                               if (options.ensure || propertyName in obj) result[propertyName] = obj[propertyName];
+                       });
+               } else {
+                       assign(result, obj);
+               }
+               return result;
+       };
+
+       var bind                    = Function.prototype.bind
+         , call$1                    = Function.prototype.call
+         , keys$2                    = Object.keys
+         , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+       var _iterate = function (method, defVal) {
+               return function (obj, cb /*, thisArg, compareFn*/) {
+                       var list, thisArg = arguments[2], compareFn = arguments[3];
+                       obj = Object(validValue(obj));
+                       validCallable(cb);
+
+                       list = keys$2(obj);
+                       if (compareFn) {
+                               list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
+                       }
+                       if (typeof method !== "function") method = list[method];
+                       return call$1.call(method, list, function (key, index) {
+                               if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
+                               return call$1.call(cb, thisArg, obj[key], key, obj, index);
+                       });
+               };
+       };
+
+       var forEach$1 = _iterate("forEach");
+
+       var call$2     = Function.prototype.call;
+
+       var map$1 = function (obj, cb /*, thisArg*/) {
+               var result = {}, thisArg = arguments[2];
+               validCallable(cb);
+               forEach$1(obj, function (value, key, targetObj, index) {
+                       result[key] = call$2.call(cb, thisArg, value, key, targetObj, index);
+               });
+               return result;
+       };
+
+       var callable         = validCallable
+
+         , bind$1 = Function.prototype.bind, defineProperty$3 = Object.defineProperty
+         , hasOwnProperty = Object.prototype.hasOwnProperty
+         , define;
+
+       define = function (name, desc, options) {
+               var value = validValue(desc) && callable(desc.value), dgs;
+               dgs = copy(desc);
+               delete dgs.writable;
+               delete dgs.value;
+               dgs.get = function () {
+                       if (!options.overwriteDefinition && hasOwnProperty.call(this, name)) return value;
+                       desc.value = bind$1.call(value, options.resolveContext ? options.resolveContext(this) : this);
+                       defineProperty$3(this, name, desc);
+                       return this[name];
+               };
+               return dgs;
+       };
+
+       var autoBind = function (props/*, options*/) {
+               var options = normalizeOptions(arguments[1]);
+               if (options.resolveContext != null) validCallable(options.resolveContext);
+               return map$1(props, function (desc, name) { return define(name, desc, options); });
+       };
+
+       var defineProperty$4 = Object.defineProperty, defineProperties$1 = Object.defineProperties, Iterator;
+
+       var es6Iterator = Iterator = function (list, context) {
+               if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'");
+               defineProperties$1(this, {
+                       __list__: d_1("w", validValue(list)),
+                       __context__: d_1("w", context),
+                       __nextIndex__: d_1("w", 0)
+               });
+               if (!context) return;
+               validCallable(context.on);
+               context.on("_add", this._onAdd);
+               context.on("_delete", this._onDelete);
+               context.on("_clear", this._onClear);
+       };
+
+       // Internal %IteratorPrototype% doesn't expose its constructor
+       delete Iterator.prototype.constructor;
+
+       defineProperties$1(
+               Iterator.prototype,
+               assign(
+                       {
+                               _next: d_1(function () {
+                                       var i;
+                                       if (!this.__list__) return undefined;
+                                       if (this.__redo__) {
+                                               i = this.__redo__.shift();
+                                               if (i !== undefined) return i;
+                                       }
+                                       if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
+                                       this._unBind();
+                                       return undefined;
+                               }),
+                               next: d_1(function () {
+                                       return this._createResult(this._next());
+                               }),
+                               _createResult: d_1(function (i) {
+                                       if (i === undefined) return { done: true, value: undefined };
+                                       return { done: false, value: this._resolve(i) };
+                               }),
+                               _resolve: d_1(function (i) {
+                                       return this.__list__[i];
+                               }),
+                               _unBind: d_1(function () {
+                                       this.__list__ = null;
+                                       delete this.__redo__;
+                                       if (!this.__context__) return;
+                                       this.__context__.off("_add", this._onAdd);
+                                       this.__context__.off("_delete", this._onDelete);
+                                       this.__context__.off("_clear", this._onClear);
+                                       this.__context__ = null;
+                               }),
+                               toString: d_1(function () {
+                                       return "[object " + (this[es6Symbol.toStringTag] || "Object") + "]";
+                               })
+                       },
+                       autoBind({
+                               _onAdd: d_1(function (index) {
+                                       if (index >= this.__nextIndex__) return;
+                                       ++this.__nextIndex__;
+                                       if (!this.__redo__) {
+                                               defineProperty$4(this, "__redo__", d_1("c", [index]));
+                                               return;
+                                       }
+                                       this.__redo__.forEach(function (redo, i) {
+                                               if (redo >= index) this.__redo__[i] = ++redo;
+                                       }, this);
+                                       this.__redo__.push(index);
+                               }),
+                               _onDelete: d_1(function (index) {
+                                       var i;
+                                       if (index >= this.__nextIndex__) return;
+                                       --this.__nextIndex__;
+                                       if (!this.__redo__) return;
+                                       i = this.__redo__.indexOf(index);
+                                       if (i !== -1) this.__redo__.splice(i, 1);
+                                       this.__redo__.forEach(function (redo, j) {
+                                               if (redo > index) this.__redo__[j] = --redo;
+                                       }, this);
+                               }),
+                               _onClear: d_1(function () {
+                                       if (this.__redo__) clear.call(this.__redo__);
+                                       this.__nextIndex__ = 0;
+                               })
+                       })
+               )
+       );
+
+       defineProperty$4(
+               Iterator.prototype,
+               es6Symbol.iterator,
+               d_1(function () {
+                       return this;
+               })
+       );
+
+       var array = createCommonjsModule(function (module) {
+
+
+
+       var defineProperty = Object.defineProperty, ArrayIterator;
+
+       ArrayIterator = module.exports = function (arr, kind) {
+               if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
+               es6Iterator.call(this, arr);
+               if (!kind) kind = "value";
+               else if (contains.call(kind, "key+value")) kind = "key+value";
+               else if (contains.call(kind, "key")) kind = "key";
+               else kind = "value";
+               defineProperty(this, "__kind__", d_1("", kind));
+       };
+       if (setPrototypeOf) setPrototypeOf(ArrayIterator, es6Iterator);
+
+       // Internal %ArrayIteratorPrototype% doesn't expose its constructor
+       delete ArrayIterator.prototype.constructor;
+
+       ArrayIterator.prototype = Object.create(es6Iterator.prototype, {
+               _resolve: d_1(function (i) {
+                       if (this.__kind__ === "value") return this.__list__[i];
+                       if (this.__kind__ === "key+value") return [i, this.__list__[i]];
+                       return i;
+               })
+       });
+       defineProperty(ArrayIterator.prototype, es6Symbol.toStringTag, d_1("c", "Array Iterator"));
+       });
+
+       var string = createCommonjsModule(function (module) {
+
+
+
+       var defineProperty = Object.defineProperty, StringIterator;
+
+       StringIterator = module.exports = function (str) {
+               if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
+               str = String(str);
+               es6Iterator.call(this, str);
+               defineProperty(this, "__length__", d_1("", str.length));
+       };
+       if (setPrototypeOf) setPrototypeOf(StringIterator, es6Iterator);
+
+       // Internal %ArrayIteratorPrototype% doesn't expose its constructor
+       delete StringIterator.prototype.constructor;
+
+       StringIterator.prototype = Object.create(es6Iterator.prototype, {
+               _next: d_1(function () {
+                       if (!this.__list__) return undefined;
+                       if (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;
+                       this._unBind();
+                       return undefined;
+               }),
+               _resolve: d_1(function (i) {
+                       var char = this.__list__[i], code;
+                       if (this.__nextIndex__ === this.__length__) return char;
+                       code = char.charCodeAt(0);
+                       if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
+                       return char;
+               })
+       });
+       defineProperty(StringIterator.prototype, es6Symbol.toStringTag, d_1("c", "String Iterator"));
+       });
+
+       var iteratorSymbol$2 = es6Symbol.iterator;
+
+       var get = function (obj) {
+               if (typeof validIterable(obj)[iteratorSymbol$2] === "function") return obj[iteratorSymbol$2]();
+               if (isArguments(obj)) return new array(obj);
+               if (isString(obj)) return new string(obj);
+               return new array(obj);
+       };
+
+       var isArray$2 = Array.isArray, call$3 = Function.prototype.call, some = Array.prototype.some;
+
+       var forOf = function (iterable, cb /*, thisArg*/) {
+               var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code;
+               if (isArray$2(iterable) || isArguments(iterable)) mode = "array";
+               else if (isString(iterable)) mode = "string";
+               else iterable = get(iterable);
+
+               validCallable(cb);
+               doBreak = function () {
+                       broken = true;
+               };
+               if (mode === "array") {
+                       some.call(iterable, function (value) {
+                               call$3.call(cb, thisArg, value, doBreak);
+                               return broken;
+                       });
+                       return;
+               }
+               if (mode === "string") {
+                       length = iterable.length;
+                       for (i = 0; i < length; ++i) {
+                               char = iterable[i];
+                               if (i + 1 < length) {
+                                       code = char.charCodeAt(0);
+                                       if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
+                               }
+                               call$3.call(cb, thisArg, char, doBreak);
+                               if (broken) break;
+                       }
+                       return;
+               }
+               result = iterable.next();
+
+               while (!result.done) {
+                       call$3.call(cb, thisArg, result.value, doBreak);
+                       if (broken) return;
+                       result = iterable.next();
+               }
+       };
+
+       var iterator = createCommonjsModule(function (module) {
+
+       var toStringTagSymbol = es6Symbol.toStringTag
+
+         , defineProperty = Object.defineProperty
+         , SetIterator;
+
+       SetIterator = module.exports = function (set, kind) {
+               if (!(this instanceof SetIterator)) return new SetIterator(set, kind);
+               es6Iterator.call(this, set.__setData__, set);
+               if (!kind) kind = 'value';
+               else if (contains.call(kind, 'key+value')) kind = 'key+value';
+               else kind = 'value';
+               defineProperty(this, '__kind__', d_1('', kind));
+       };
+       if (setPrototypeOf) setPrototypeOf(SetIterator, es6Iterator);
+
+       SetIterator.prototype = Object.create(es6Iterator.prototype, {
+               constructor: d_1(SetIterator),
+               _resolve: d_1(function (i) {
+                       if (this.__kind__ === 'value') return this.__list__[i];
+                       return [this.__list__[i], this.__list__[i]];
+               }),
+               toString: d_1(function () { return '[object Set Iterator]'; })
+       });
+       defineProperty(SetIterator.prototype, toStringTagSymbol, d_1('c', 'Set Iterator'));
+       });
+
+       // Exports true if environment provides native `Set` implementation,
+
+       var isNativeImplemented = (function () {
+               if (typeof Set === 'undefined') return false;
+               return (Object.prototype.toString.call(Set.prototype) === '[object Set]');
+       }());
+
+       var iterator$1       = validIterable
+
+         , call$4 = Function.prototype.call
+         , defineProperty$5 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf
+         , SetPoly, getValues, NativeSet;
+
+       if (isNativeImplemented) NativeSet = Set;
+
+       var polyfill$1 = SetPoly = function Set(/*iterable*/) {
+               var iterable = arguments[0], self;
+               if (!(this instanceof SetPoly)) throw new TypeError('Constructor requires \'new\'');
+               if (isNativeImplemented && setPrototypeOf) self = setPrototypeOf(new NativeSet(), getPrototypeOf$1(this));
+               else self = this;
+               if (iterable != null) iterator$1(iterable);
+               defineProperty$5(self, '__setData__', d_1('c', []));
+               if (!iterable) return self;
+               forOf(iterable, function (value) {
+                       if (eIndexOf.call(this, value) !== -1) return;
+                       this.push(value);
+               }, self.__setData__);
+               return self;
+       };
+
+       if (isNativeImplemented) {
+               if (setPrototypeOf) setPrototypeOf(SetPoly, NativeSet);
+               SetPoly.prototype = Object.create(NativeSet.prototype, { constructor: d_1(SetPoly) });
+       }
+
+       eventEmitter(Object.defineProperties(SetPoly.prototype, {
+               add: d_1(function (value) {
+                       if (this.has(value)) return this;
+                       this.emit('_add', this.__setData__.push(value) - 1, value);
+                       return this;
+               }),
+               clear: d_1(function () {
+                       if (!this.__setData__.length) return;
+                       clear.call(this.__setData__);
+                       this.emit('_clear');
+               }),
+               delete: d_1(function (value) {
+                       var index = eIndexOf.call(this.__setData__, value);
+                       if (index === -1) return false;
+                       this.__setData__.splice(index, 1);
+                       this.emit('_delete', index, value);
+                       return true;
+               }),
+               entries: d_1(function () { return new iterator(this, 'key+value'); }),
+               forEach: d_1(function (cb/*, thisArg*/) {
+                       var thisArg = arguments[1], iterator, result, value;
+                       validCallable(cb);
+                       iterator = this.values();
+                       result = iterator._next();
+                       while (result !== undefined) {
+                               value = iterator._resolve(result);
+                               call$4.call(cb, thisArg, value, value, this);
+                               result = iterator._next();
+                       }
+               }),
+               has: d_1(function (value) {
+                       return (eIndexOf.call(this.__setData__, value) !== -1);
+               }),
+               keys: d_1(getValues = function () { return this.values(); }),
+               size: d_1.gs(function () { return this.__setData__.length; }),
+               values: d_1(function () { return new iterator(this); }),
+               toString: d_1(function () { return '[object Set]'; })
+       }));
+       defineProperty$5(SetPoly.prototype, es6Symbol.iterator, d_1(getValues));
+       defineProperty$5(SetPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Set'));
+
+       var es6Set = isImplemented() ? Set : polyfill$1;
+
+       var isImplemented$9 = function () {
+               var map, iterator, result;
+               if (typeof Map !== 'function') return false;
+               try {
+                       // WebKit doesn't support arguments and crashes
+                       map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);
+               } catch (e) {
+                       return false;
+               }
+               if (String(map) !== '[object Map]') return false;
+               if (map.size !== 3) return false;
+               if (typeof map.clear !== 'function') return false;
+               if (typeof map.delete !== 'function') return false;
+               if (typeof map.entries !== 'function') return false;
+               if (typeof map.forEach !== 'function') return false;
+               if (typeof map.get !== 'function') return false;
+               if (typeof map.has !== 'function') return false;
+               if (typeof map.keys !== 'function') return false;
+               if (typeof map.set !== 'function') return false;
+               if (typeof map.values !== 'function') return false;
+
+               iterator = map.entries();
+               result = iterator.next();
+               if (result.done !== false) return false;
+               if (!result.value) return false;
+               if (result.value[0] !== 'raz') return false;
+               if (result.value[1] !== 'one') return false;
+
+               return true;
+       };
+
+       var forEach$2 = Array.prototype.forEach, create$4 = Object.create;
+
+       // eslint-disable-next-line no-unused-vars
+       var primitiveSet = function (arg /*, …args*/) {
+               var set = create$4(null);
+               forEach$2.call(arguments, function (name) {
+                       set[name] = true;
+               });
+               return set;
+       };
+
+       var iteratorKinds = primitiveSet('key',
+               'value', 'key+value');
+
+       var iterator$2 = createCommonjsModule(function (module) {
+
+       var toStringTagSymbol = es6Symbol.toStringTag
+
+         , defineProperties = Object.defineProperties
+         , unBind = es6Iterator.prototype._unBind
+         , MapIterator;
+
+       MapIterator = module.exports = function (map, kind) {
+               if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
+               es6Iterator.call(this, map.__mapKeysData__, map);
+               if (!kind || !iteratorKinds[kind]) kind = 'key+value';
+               defineProperties(this, {
+                       __kind__: d_1('', kind),
+                       __values__: d_1('w', map.__mapValuesData__)
+               });
+       };
+       if (setPrototypeOf) setPrototypeOf(MapIterator, es6Iterator);
+
+       MapIterator.prototype = Object.create(es6Iterator.prototype, {
+               constructor: d_1(MapIterator),
+               _resolve: d_1(function (i) {
+                       if (this.__kind__ === 'value') return this.__values__[i];
+                       if (this.__kind__ === 'key') return this.__list__[i];
+                       return [this.__list__[i], this.__values__[i]];
+               }),
+               _unBind: d_1(function () {
+                       this.__values__ = null;
+                       unBind.call(this);
+               }),
+               toString: d_1(function () { return '[object Map Iterator]'; })
+       });
+       Object.defineProperty(MapIterator.prototype, toStringTagSymbol,
+               d_1('c', 'Map Iterator'));
+       });
+
+       // Exports true if environment provides native `Map` implementation,
+
+       var isNativeImplemented$1 = (function () {
+               if (typeof Map === 'undefined') return false;
+               return (Object.prototype.toString.call(new Map()) === '[object Map]');
+       }());
+
+       var iterator$3       = validIterable
+
+         , call$5 = Function.prototype.call
+         , defineProperties$2 = Object.defineProperties, getPrototypeOf$2 = Object.getPrototypeOf
+         , MapPoly;
+
+       var polyfill$2 = MapPoly = function (/*iterable*/) {
+               var iterable = arguments[0], keys, values, self;
+               if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
+               if (isNativeImplemented$1 && setPrototypeOf && (Map !== MapPoly)) {
+                       self = setPrototypeOf(new Map(), getPrototypeOf$2(this));
+               } else {
+                       self = this;
+               }
+               if (iterable != null) iterator$3(iterable);
+               defineProperties$2(self, {
+                       __mapKeysData__: d_1('c', keys = []),
+                       __mapValuesData__: d_1('c', values = [])
+               });
+               if (!iterable) return self;
+               forOf(iterable, function (value) {
+                       var key = validValue(value)[0];
+                       value = value[1];
+                       if (eIndexOf.call(keys, key) !== -1) return;
+                       keys.push(key);
+                       values.push(value);
+               }, self);
+               return self;
+       };
+
+       if (isNativeImplemented$1) {
+               if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
+               MapPoly.prototype = Object.create(Map.prototype, {
+                       constructor: d_1(MapPoly)
+               });
+       }
+
+       eventEmitter(defineProperties$2(MapPoly.prototype, {
+               clear: d_1(function () {
+                       if (!this.__mapKeysData__.length) return;
+                       clear.call(this.__mapKeysData__);
+                       clear.call(this.__mapValuesData__);
+                       this.emit('_clear');
+               }),
+               delete: d_1(function (key) {
+                       var index = eIndexOf.call(this.__mapKeysData__, key);
+                       if (index === -1) return false;
+                       this.__mapKeysData__.splice(index, 1);
+                       this.__mapValuesData__.splice(index, 1);
+                       this.emit('_delete', index, key);
+                       return true;
+               }),
+               entries: d_1(function () { return new iterator$2(this, 'key+value'); }),
+               forEach: d_1(function (cb/*, thisArg*/) {
+                       var thisArg = arguments[1], iterator, result;
+                       validCallable(cb);
+                       iterator = this.entries();
+                       result = iterator._next();
+                       while (result !== undefined) {
+                               call$5.call(cb, thisArg, this.__mapValuesData__[result],
+                                       this.__mapKeysData__[result], this);
+                               result = iterator._next();
+                       }
+               }),
+               get: d_1(function (key) {
+                       var index = eIndexOf.call(this.__mapKeysData__, key);
+                       if (index === -1) return;
+                       return this.__mapValuesData__[index];
+               }),
+               has: d_1(function (key) {
+                       return (eIndexOf.call(this.__mapKeysData__, key) !== -1);
+               }),
+               keys: d_1(function () { return new iterator$2(this, 'key'); }),
+               set: d_1(function (key, value) {
+                       var index = eIndexOf.call(this.__mapKeysData__, key), emit;
+                       if (index === -1) {
+                               index = this.__mapKeysData__.push(key) - 1;
+                               emit = true;
+                       }
+                       this.__mapValuesData__[index] = value;
+                       if (emit) this.emit('_add', index, key);
+                       return this;
+               }),
+               size: d_1.gs(function () { return this.__mapKeysData__.length; }),
+               values: d_1(function () { return new iterator$2(this, 'value'); }),
+               toString: d_1(function () { return '[object Map]'; })
+       }));
+       Object.defineProperty(MapPoly.prototype, es6Symbol.iterator, d_1(function () {
+               return this.entries();
+       }));
+       Object.defineProperty(MapPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Map'));
+
+       var es6Map = isImplemented$9() ? Map : polyfill$2;
+
+       var toStr = Object.prototype.toString;
+
+       var isArguments$1 = function isArguments(value) {
+               var str = toStr.call(value);
+               var isArgs = str === '[object Arguments]';
+               if (!isArgs) {
+                       isArgs = str !== '[object Array]' &&
+                               value !== null &&
+                               typeof value === 'object' &&
+                               typeof value.length === 'number' &&
+                               value.length >= 0 &&
+                               toStr.call(value.callee) === '[object Function]';
+               }
+               return isArgs;
+       };
+
+       var keysShim;
+       if (!Object.keys) {
+               // modified from https://github.com/es-shims/es5-shim
+               var has = Object.prototype.hasOwnProperty;
+               var toStr$1 = Object.prototype.toString;
+               var isArgs = isArguments$1; // eslint-disable-line global-require
+               var isEnumerable = Object.prototype.propertyIsEnumerable;
+               var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
+               var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
+               var dontEnums = [
+                       'toString',
+                       'toLocaleString',
+                       'valueOf',
+                       'hasOwnProperty',
+                       'isPrototypeOf',
+                       'propertyIsEnumerable',
+                       'constructor'
+               ];
+               var equalsConstructorPrototype = function (o) {
+                       var ctor = o.constructor;
+                       return ctor && ctor.prototype === o;
+               };
+               var excludedKeys = {
+                       $applicationCache: true,
+                       $console: true,
+                       $external: true,
+                       $frame: true,
+                       $frameElement: true,
+                       $frames: true,
+                       $innerHeight: true,
+                       $innerWidth: true,
+                       $outerHeight: true,
+                       $outerWidth: true,
+                       $pageXOffset: true,
+                       $pageYOffset: true,
+                       $parent: true,
+                       $scrollLeft: true,
+                       $scrollTop: true,
+                       $scrollX: true,
+                       $scrollY: true,
+                       $self: true,
+                       $webkitIndexedDB: true,
+                       $webkitStorageInfo: true,
+                       $window: true
+               };
+               var hasAutomationEqualityBug = (function () {
+                       /* global window */
+                       if (typeof window === 'undefined') { return false; }
+                       for (var k in window) {
+                               try {
+                                       if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
+                                               try {
+                                                       equalsConstructorPrototype(window[k]);
+                                               } catch (e) {
+                                                       return true;
+                                               }
+                                       }
+                               } catch (e) {
+                                       return true;
+                               }
+                       }
+                       return false;
+               }());
+               var equalsConstructorPrototypeIfNotBuggy = function (o) {
+                       /* global window */
+                       if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
+                               return equalsConstructorPrototype(o);
+                       }
+                       try {
+                               return equalsConstructorPrototype(o);
+                       } catch (e) {
+                               return false;
+                       }
+               };
+
+               keysShim = function keys(object) {
+                       var isObject = object !== null && typeof object === 'object';
+                       var isFunction = toStr$1.call(object) === '[object Function]';
+                       var isArguments = isArgs(object);
+                       var isString = isObject && toStr$1.call(object) === '[object String]';
+                       var theKeys = [];
+
+                       if (!isObject && !isFunction && !isArguments) {
+                               throw new TypeError('Object.keys called on a non-object');
+                       }
+
+                       var skipProto = hasProtoEnumBug && isFunction;
+                       if (isString && object.length > 0 && !has.call(object, 0)) {
+                               for (var i = 0; i < object.length; ++i) {
+                                       theKeys.push(String(i));
+                               }
+                       }
+
+                       if (isArguments && object.length > 0) {
+                               for (var j = 0; j < object.length; ++j) {
+                                       theKeys.push(String(j));
+                               }
+                       } else {
+                               for (var name in object) {
+                                       if (!(skipProto && name === 'prototype') && has.call(object, name)) {
+                                               theKeys.push(String(name));
+                                       }
+                               }
+                       }
+
+                       if (hasDontEnumBug) {
+                               var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
+
+                               for (var k = 0; k < dontEnums.length; ++k) {
+                                       if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
+                                               theKeys.push(dontEnums[k]);
+                                       }
+                               }
+                       }
+                       return theKeys;
+               };
+       }
+       var implementation = keysShim;
+
+       var slice = Array.prototype.slice;
+
+
+       var origKeys = Object.keys;
+       var keysShim$1 = origKeys ? function keys(o) { return origKeys(o); } : implementation;
+
+       var originalKeys = Object.keys;
+
+       keysShim$1.shim = function shimObjectKeys() {
+               if (Object.keys) {
+                       var keysWorksWithArguments = (function () {
+                               // Safari 5.0 bug
+                               var args = Object.keys(arguments);
+                               return args && args.length === arguments.length;
+                       }(1, 2));
+                       if (!keysWorksWithArguments) {
+                               Object.keys = function keys(object) { // eslint-disable-line func-name-matching
+                                       if (isArguments$1(object)) {
+                                               return originalKeys(slice.call(object));
+                                       }
+                                       return originalKeys(object);
+                               };
+                       }
+               } else {
+                       Object.keys = keysShim$1;
+               }
+               return Object.keys || keysShim$1;
+       };
+
+       var objectKeys = keysShim$1;
+
+       var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
+
+       var toStr$2 = Object.prototype.toString;
+       var concat = Array.prototype.concat;
+       var origDefineProperty = Object.defineProperty;
+
+       var isFunction$1 = function (fn) {
+               return typeof fn === 'function' && toStr$2.call(fn) === '[object Function]';
+       };
+
+       var arePropertyDescriptorsSupported = function () {
+               var obj = {};
+               try {
+                       origDefineProperty(obj, 'x', { enumerable: false, value: obj });
+                       // eslint-disable-next-line no-unused-vars, no-restricted-syntax
+                       for (var _ in obj) { // jscs:ignore disallowUnusedVariables
+                               return false;
+                       }
+                       return obj.x === obj;
+               } catch (e) { /* this is IE 8. */
+                       return false;
+               }
+       };
+       var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();
+
+       var defineProperty$6 = function (object, name, value, predicate) {
+               if (name in object && (!isFunction$1(predicate) || !predicate())) {
+                       return;
+               }
+               if (supportsDescriptors) {
+                       origDefineProperty(object, name, {
+                               configurable: true,
+                               enumerable: false,
+                               value: value,
+                               writable: true
+                       });
+               } else {
+                       object[name] = value;
+               }
+       };
+
+       var defineProperties$3 = function (object, map) {
+               var predicates = arguments.length > 2 ? arguments[2] : {};
+               var props = objectKeys(map);
+               if (hasSymbols) {
+                       props = concat.call(props, Object.getOwnPropertySymbols(map));
+               }
+               for (var i = 0; i < props.length; i += 1) {
+                       defineProperty$6(object, props[i], map[props[i]], predicates[props[i]]);
+               }
+       };
+
+       defineProperties$3.supportsDescriptors = !!supportsDescriptors;
+
+       var defineProperties_1 = defineProperties$3;
+
+       /* eslint no-invalid-this: 1 */
+
+       var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
+       var slice$1 = Array.prototype.slice;
+       var toStr$3 = Object.prototype.toString;
+       var funcType = '[object Function]';
+
+       var implementation$1 = function bind(that) {
+           var target = this;
+           if (typeof target !== 'function' || toStr$3.call(target) !== funcType) {
+               throw new TypeError(ERROR_MESSAGE + target);
+           }
+           var args = slice$1.call(arguments, 1);
+
+           var bound;
+           var binder = function () {
+               if (this instanceof bound) {
+                   var result = target.apply(
+                       this,
+                       args.concat(slice$1.call(arguments))
+                   );
+                   if (Object(result) === result) {
+                       return result;
+                   }
+                   return this;
+               } else {
+                   return target.apply(
+                       that,
+                       args.concat(slice$1.call(arguments))
+                   );
+               }
+           };
+
+           var boundLength = Math.max(0, target.length - args.length);
+           var boundArgs = [];
+           for (var i = 0; i < boundLength; i++) {
+               boundArgs.push('$' + i);
+           }
+
+           bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
+
+           if (target.prototype) {
+               var Empty = function Empty() {};
+               Empty.prototype = target.prototype;
+               bound.prototype = new Empty();
+               Empty.prototype = null;
+           }
+
+           return bound;
+       };
+
+       var functionBind = Function.prototype.bind || implementation$1;
+
+       var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
+
+       var isPrimitive = function isPrimitive(value) {
+               return value === null || (typeof value !== 'function' && typeof value !== 'object');
+       };
+
+       var fnToStr = Function.prototype.toString;
+
+       var constructorRegex = /^\s*class\b/;
+       var isES6ClassFn = function isES6ClassFunction(value) {
+               try {
+                       var fnStr = fnToStr.call(value);
+                       return constructorRegex.test(fnStr);
+               } catch (e) {
+                       return false; // not a function
+               }
+       };
+
+       var tryFunctionObject = function tryFunctionToStr(value) {
+               try {
+                       if (isES6ClassFn(value)) { return false; }
+                       fnToStr.call(value);
+                       return true;
+               } catch (e) {
+                       return false;
+               }
+       };
+       var toStr$4 = Object.prototype.toString;
+       var fnClass = '[object Function]';
+       var genClass = '[object GeneratorFunction]';
+       var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
+
+       var isCallable$1 = function isCallable(value) {
+               if (!value) { return false; }
+               if (typeof value !== 'function' && typeof value !== 'object') { return false; }
+               if (typeof value === 'function' && !value.prototype) { return true; }
+               if (hasToStringTag) { return tryFunctionObject(value); }
+               if (isES6ClassFn(value)) { return false; }
+               var strClass = toStr$4.call(value);
+               return strClass === fnClass || strClass === genClass;
+       };
+
+       var getDay = Date.prototype.getDay;
+       var tryDateObject = function tryDateObject(value) {
+               try {
+                       getDay.call(value);
+                       return true;
+               } catch (e) {
+                       return false;
+               }
+       };
+
+       var toStr$5 = Object.prototype.toString;
+       var dateClass = '[object Date]';
+       var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
+
+       var isDateObject = function isDateObject(value) {
+               if (typeof value !== 'object' || value === null) { return false; }
+               return hasToStringTag$1 ? tryDateObject(value) : toStr$5.call(value) === dateClass;
+       };
+
+       /* eslint complexity: [2, 17], max-statements: [2, 33] */
+       var shams = function hasSymbols() {
+               if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
+               if (typeof Symbol.iterator === 'symbol') { return true; }
+
+               var obj = {};
+               var sym = Symbol('test');
+               var symObj = Object(sym);
+               if (typeof sym === 'string') { return false; }
+
+               if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
+               if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
+
+               // temp disabled per https://github.com/ljharb/object.assign/issues/17
+               // if (sym instanceof Symbol) { return false; }
+               // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
+               // if (!(symObj instanceof Symbol)) { return false; }
+
+               // if (typeof Symbol.prototype.toString !== 'function') { return false; }
+               // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
+
+               var symVal = 42;
+               obj[sym] = symVal;
+               for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
+               if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
+
+               if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
+
+               var syms = Object.getOwnPropertySymbols(obj);
+               if (syms.length !== 1 || syms[0] !== sym) { return false; }
+
+               if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
+
+               if (typeof Object.getOwnPropertyDescriptor === 'function') {
+                       var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
+                       if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
+               }
+
+               return true;
+       };
+
+       var origSymbol = commonjsGlobal.Symbol;
+
+
+       var hasSymbols$1 = function hasNativeSymbols() {
+               if (typeof origSymbol !== 'function') { return false; }
+               if (typeof Symbol !== 'function') { return false; }
+               if (typeof origSymbol('foo') !== 'symbol') { return false; }
+               if (typeof Symbol('bar') !== 'symbol') { return false; }
+
+               return shams();
+       };
+
+       var isSymbol$1 = createCommonjsModule(function (module) {
+
+       var toStr = Object.prototype.toString;
+       var hasSymbols = hasSymbols$1();
+
+       if (hasSymbols) {
+               var symToStr = Symbol.prototype.toString;
+               var symStringRegex = /^Symbol\(.*\)$/;
+               var isSymbolObject = function isRealSymbolObject(value) {
+                       if (typeof value.valueOf() !== 'symbol') {
+                               return false;
+                       }
+                       return symStringRegex.test(symToStr.call(value));
+               };
+
+               module.exports = function isSymbol(value) {
+                       if (typeof value === 'symbol') {
+                               return true;
+                       }
+                       if (toStr.call(value) !== '[object Symbol]') {
+                               return false;
+                       }
+                       try {
+                               return isSymbolObject(value);
+                       } catch (e) {
+                               return false;
+                       }
+               };
+       } else {
+
+               module.exports = function isSymbol(value) {
+                       // this environment does not support Symbols.
+                       return false;
+               };
+       }
+       });
+
+       var hasSymbols$2 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+
+
+
+
+
+
+       var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
+               if (typeof O === 'undefined' || O === null) {
+                       throw new TypeError('Cannot call method on ' + O);
+               }
+               if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
+                       throw new TypeError('hint must be "string" or "number"');
+               }
+               var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
+               var method, result, i;
+               for (i = 0; i < methodNames.length; ++i) {
+                       method = O[methodNames[i]];
+                       if (isCallable$1(method)) {
+                               result = method.call(O);
+                               if (isPrimitive(result)) {
+                                       return result;
+                               }
+                       }
+               }
+               throw new TypeError('No default value');
+       };
+
+       var GetMethod = function GetMethod(O, P) {
+               var func = O[P];
+               if (func !== null && typeof func !== 'undefined') {
+                       if (!isCallable$1(func)) {
+                               throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
+                       }
+                       return func;
+               }
+               return void 0;
+       };
+
+       // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
+       var es2015 = function ToPrimitive(input) {
+               if (isPrimitive(input)) {
+                       return input;
+               }
+               var hint = 'default';
+               if (arguments.length > 1) {
+                       if (arguments[1] === String) {
+                               hint = 'string';
+                       } else if (arguments[1] === Number) {
+                               hint = 'number';
+                       }
+               }
+
+               var exoticToPrim;
+               if (hasSymbols$2) {
+                       if (Symbol.toPrimitive) {
+                               exoticToPrim = GetMethod(input, Symbol.toPrimitive);
+                       } else if (isSymbol$1(input)) {
+                               exoticToPrim = Symbol.prototype.valueOf;
+                       }
+               }
+               if (typeof exoticToPrim !== 'undefined') {
+                       var result = exoticToPrim.call(input, hint);
+                       if (isPrimitive(result)) {
+                               return result;
+                       }
+                       throw new TypeError('unable to convert exotic object to primitive');
+               }
+               if (hint === 'default' && (isDateObject(input) || isSymbol$1(input))) {
+                       hint = 'string';
+               }
+               return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
+       };
+
+       var es6 = es2015;
+
+       /* globals
+               Set,
+               Map,
+               WeakSet,
+               WeakMap,
+
+               Promise,
+
+               Symbol,
+               Proxy,
+
+               Atomics,
+               SharedArrayBuffer,
+
+               ArrayBuffer,
+               DataView,
+               Uint8Array,
+               Float32Array,
+               Float64Array,
+               Int8Array,
+               Int16Array,
+               Int32Array,
+               Uint8ClampedArray,
+               Uint16Array,
+               Uint32Array,
+       */
+
+       var undefined$1; // eslint-disable-line no-shadow-restricted-names
+
+       var ThrowTypeError = Object.getOwnPropertyDescriptor
+               ? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())
+               : function () { throw new TypeError(); };
+
+       var hasSymbols$3 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+
+       var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
+       var generatorFunction = undefined$1;
+       var asyncFunction = undefined$1;
+       var asyncGenFunction = undefined$1;
+
+       var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array);
+
+       var INTRINSICS = {
+               '$ %Array%': Array,
+               '$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
+               '$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype,
+               '$ %ArrayIteratorPrototype%': hasSymbols$3 ? getProto([][Symbol.iterator]()) : undefined$1,
+               '$ %ArrayPrototype%': Array.prototype,
+               '$ %ArrayProto_entries%': Array.prototype.entries,
+               '$ %ArrayProto_forEach%': Array.prototype.forEach,
+               '$ %ArrayProto_keys%': Array.prototype.keys,
+               '$ %ArrayProto_values%': Array.prototype.values,
+               '$ %AsyncFromSyncIteratorPrototype%': undefined$1,
+               '$ %AsyncFunction%': asyncFunction,
+               '$ %AsyncFunctionPrototype%': undefined$1,
+               '$ %AsyncGenerator%': undefined$1,
+               '$ %AsyncGeneratorFunction%': asyncGenFunction,
+               '$ %AsyncGeneratorPrototype%': undefined$1,
+               '$ %AsyncIteratorPrototype%': undefined$1,
+               '$ %Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics,
+               '$ %Boolean%': Boolean,
+               '$ %BooleanPrototype%': Boolean.prototype,
+               '$ %DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView,
+               '$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype,
+               '$ %Date%': Date,
+               '$ %DatePrototype%': Date.prototype,
+               '$ %decodeURI%': decodeURI,
+               '$ %decodeURIComponent%': decodeURIComponent,
+               '$ %encodeURI%': encodeURI,
+               '$ %encodeURIComponent%': encodeURIComponent,
+               '$ %Error%': Error,
+               '$ %ErrorPrototype%': Error.prototype,
+               '$ %eval%': eval, // eslint-disable-line no-eval
+               '$ %EvalError%': EvalError,
+               '$ %EvalErrorPrototype%': EvalError.prototype,
+               '$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array,
+               '$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype,
+               '$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array,
+               '$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype,
+               '$ %Function%': Function,
+               '$ %FunctionPrototype%': Function.prototype,
+               '$ %Generator%': undefined$1,
+               '$ %GeneratorFunction%': generatorFunction,
+               '$ %GeneratorPrototype%': undefined$1,
+               '$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array,
+               '$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype,
+               '$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array,
+               '$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype,
+               '$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
+               '$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype,
+               '$ %isFinite%': isFinite,
+               '$ %isNaN%': isNaN,
+               '$ %IteratorPrototype%': hasSymbols$3 ? getProto(getProto([][Symbol.iterator]())) : undefined$1,
+               '$ %JSON%': JSON,
+               '$ %JSONParse%': JSON.parse,
+               '$ %Map%': typeof Map === 'undefined' ? undefined$1 : Map,
+               '$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Map()[Symbol.iterator]()),
+               '$ %MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype,
+               '$ %Math%': Math,
+               '$ %Number%': Number,
+               '$ %NumberPrototype%': Number.prototype,
+               '$ %Object%': Object,
+               '$ %ObjectPrototype%': Object.prototype,
+               '$ %ObjProto_toString%': Object.prototype.toString,
+               '$ %ObjProto_valueOf%': Object.prototype.valueOf,
+               '$ %parseFloat%': parseFloat,
+               '$ %parseInt%': parseInt,
+               '$ %Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise,
+               '$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype,
+               '$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then,
+               '$ %Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all,
+               '$ %Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject,
+               '$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve,
+               '$ %Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy,
+               '$ %RangeError%': RangeError,
+               '$ %RangeErrorPrototype%': RangeError.prototype,
+               '$ %ReferenceError%': ReferenceError,
+               '$ %ReferenceErrorPrototype%': ReferenceError.prototype,
+               '$ %Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
+               '$ %RegExp%': RegExp,
+               '$ %RegExpPrototype%': RegExp.prototype,
+               '$ %Set%': typeof Set === 'undefined' ? undefined$1 : Set,
+               '$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Set()[Symbol.iterator]()),
+               '$ %SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype,
+               '$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
+               '$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype,
+               '$ %String%': String,
+               '$ %StringIteratorPrototype%': hasSymbols$3 ? getProto(''[Symbol.iterator]()) : undefined$1,
+               '$ %StringPrototype%': String.prototype,
+               '$ %Symbol%': hasSymbols$3 ? Symbol : undefined$1,
+               '$ %SymbolPrototype%': hasSymbols$3 ? Symbol.prototype : undefined$1,